ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのA.txtから特定の行と列をB.txtに出力する方法

  • mixiチェック
  • このエントリーをはてなブックマークに追加
初めまして、当方JAVAを始めて1ヶ月の若輩者です。

プログラミングをおこなっていく中で課題にぶつかって、悩んでいます。
Web検索やマニュアルを見ながら取り組んでいますが、ほとほと困っております。

課題は以下のとおりです。

特定の.txtファイルのX行からY行の文字列の一部を取り出し、別テキストファイルとして出力する。
たとえば、下記のようなtest00.txtファイルがあった場合に、2行目から9行目までの
2列目(022,032,…,092)を取り出して、数値として、別テキストファイル(test01.txt)として出力する感じです。

test00.txt
011 012 013 014 015
021 022 023 024 025
031 032 033 034 035
041 042 043 044 045
051 052 053 054 055
061 062 063 064 065
071 072 073 074 075
081 082 083 084 085
091 092 093 094 095
101 102 103 104 105

test01.txt
022
032
042
052
062
072
082
092

RandomAccessFileのseekメソッドやreadLineでやっていたのですが、どうもうまくいきません。
初歩的な質問で申し訳ありませんが、どなたかご教授お願いします。
開発環境は、XPとjdk1.5.0_10で取り組んでいます。

コメント(5)

これでtest00.txtのあるフォルダで実行するとtest01.txtが出来ます。

package bancho.club.activity;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

public class Main {
 private static final String INPUT = "test00.txt";

 private static final String OUTPUT = "test01.txt";

 private static final int BEGIN = 2;

 private static final int END = 9;

 private static final int COLUMN_INDEX = 2;

 public static void main(String[] args) {
  List<String[]> lines = readLines(INPUT);
  if (lines == null || lines.isEmpty()) {
   System.out.println("さよなら");
   return;
  }

  List<String> ret = getRange(lines, BEGIN, END, COLUMN_INDEX);

  if (ret == null) {
   System.out.println("さよなら");
   return;
  }

  if (!writeLines(ret, OUTPUT)) {
   System.out.println("失敗");
  }

 }

 private static boolean writeLines(List<String> ret, String output) {
  PrintWriter pw = null;
  try {
   pw = new PrintWriter(output);
   for (String data : ret) {
    pw.println(data);
   }
   return true;
  } catch (IOException e) {
   return false;
  } finally {
   close(pw);
  }
 }

 private static List<String> getRange(List<String[]> lines, int begin,
   int end, int columnIndex) {
  try {
   List<String> ret = new ArrayList<String>();
   for (int i = begin - 1; i < end; i++) {
    ret.add(lines.get(i)[columnIndex - 1]);
   }
   return ret;
  } catch (IndexOutOfBoundsException e) {
   return null;
  }
 }

 private static List<String[]> readLines(String input) {
  BufferedReader br = null;
  try {
   br = new BufferedReader(new FileReader(input));
   List<String[]> lines = new ArrayList<String[]>();
   for (String line = null; (line = br.readLine()) != null;) {
    lines.add(line.split(" "));
   }
   return lines;
  } catch (IOException e) {
   return null;
  } finally {
   close(br);
  }
 }

 private static final void close(Reader reader) {
  try {
   if (reader != null) {
    reader.close();
   }
  } catch (IOException e) {
  }
 }

 private static final void close(Writer writer) {
  try {
   if (writer != null) {
    writer.close();
   }
  } catch (IOException e) {
  }
 }
}
//----- ----- ----- ----- -----

import java.io.*;

public class Hoge{
    public static void main(String[] args){
        String input = "in.dat";
        String output = "output.dat";
        Hoge.cut(input , output , 3 , 8 , 1 , 3);
    }
    
    public static void cut(String input, String output, int is, int ie, int js, int je){
        try{
            BufferedReader br = new BufferedReader(new FileReader(input));
            PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(output)));
            
            int iSpan = ie-is;
            int jSpan = je-js;
            String[][] body = new String[iSpan][jSpan];
            
            String line;
            for(int i = 0;(line = br.readLine()) != null && i < ie;i++){
                if(i >=is){
                    String[] buf = line.split(" ");
                    for(int j=js;j<je;j++){
             body[i-is][j-js] = buf[j];
                        System.out.println(buf[j]);
                    }
                }
            }
            br.close();
            
            for(int i=0;i<iSpan;i++){
                for(int j=0;j<jSpan;j++){
                    pw.print(body[i][j]+" ");
                }
                pw.println();
            }
            pw.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}
↑コメント付け忘れました;

ただファイルから読んで切り出してファイルに書き出すだけです。
切り出したデータをそのあといろいろいじりたいなら かずきちさんのプログラムを参考にして適当なListに収める方がよいでしょう。

cutの引数は
is行目以降ie行目直前まで(ie行目は含まない)
js列目以降je列目直前まで(je列目は含まない)
を切り出す、という指示です。
質問者です
お早いレス本当にありがとうございます!

早速試してみます
ありがとうございました
我ながら無駄が多いなぁ、と思ったので簡潔にしてみました。
切り出したデータをいじるなら2.のプログラムでファイルを読んだ後(br.close()の後)
retrurn body;
で配列を返すといいかもしれないですね。

//----- ----- ----- ----- -----
import java.io.*;

public class Hoge{
 public static void main(String[] args){
  Hoge.cut("in.dat" , "out.dat" , 3 , 8 , 1 , 3);
 }
 
 public static void cut(String input, String output, int is, int ie, int js, int je){
  try{
   BufferedReader br = new BufferedReader(new FileReader(input));
   PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(output)));
   String line;
   for(int i = 0;(line = br.readLine()) != null && i < ie;i++){
    if(i >=is){
     String[] buf = line.split(" ");
     for(int j=js;j<je;j++){
      pw.print(buf[j]+" ");
     }
     pw.println();
    }
   }
   br.close();
   pw.close();
  }
  catch(Exception e){
   e.printStackTrace();
  }
 }
}

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング