ファイルから読み込んだ文字は前から解釈することが多いですが、ある程度のまとまり(例えば1行)を読みこんでから後ろから解釈した方が楽な場合があります。
例えば、項目数が可変の場合に後ろの項目を取得するような場合に楽に処理できます。
今回は、以下のCSVファイルから、ユーザー名(3項目目)を読みこむ例を考えてみます。
【ファイルフォーマット】
1項目目…連番(7文字固定の数値)
2項目目…コメント(改行文字は含まない、カンマ(区切り文字)はエスケープされない)
3項目目…ユーザー名(改行文字やカンマは含まれない)
サンプルコードは以下のようになります。
1行読み込んで後ろから文字列を組み立てている所がポイントです。
【サンプルコード】
・FileReadWriteMain3.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class FileReadWriteMain3 {
public static void main(String[] args) {
// 1バイトずつ読込(テキストファイルとして処理)
BufferedReader br = null;
BufferedWriter bw = null;
try {
// 入出力ファイルパス
br = new BufferedReader
(new InputStreamReader
(new FileInputStream("C:\\tmp\\test.csv"),"MS932"));
bw = new BufferedWriter
(new OutputStreamWriter
(new FileOutputStream("C:\\tmp\\test_out.csv"), "MS932"));
// 読み込んだ箇所を保持
StringBuilder sb = new StringBuilder();
// データ読み込みループ
while (true){
// 1行読み込み
String str = br.readLine();
if (str == null) {
break;
}
// 読み込んだ行を後ろから解釈
sb.delete(0, sb.length());
for(int i = str.length() - 1; i >= 0; i--) {
if (String.valueOf(str.charAt(i)).equals(",")) {
// 3項目目の終わりとして判定しループを抜ける
break;
} else {
// 3項目目(ユーザー名)を組み立てる
sb.insert(0,str.charAt(i));
}
}
// 組み立てたユーザー名を出力
bw.write(sb.toString());
bw.newLine();
}
// 例外処理
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
【処理結果】
・インプットファイル
0000001,コメントの中にカンマ,がある,hoge
0000002,コメント,fuga
・アウトプットファイル
hoge
fuga