こんな感じのテキストファイル
aa,bb //start 1,2,3,4,5 11,21,33,34,95 21,61,38,33,15 //end aaa,bb aad,bb //start1 13,21,3,43,5 11,21,33,334,95 21,61,38,133,315 //end2 aaa,bb
があったとき、//start~//end,//start1~//end1で囲まれているカンマ区切りの数値処理を行うプログラムをJavaで書いてみる
package file; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class FileReadTest { private static String FILE_PATH ="C:\\test\\readTest.txt"; public static void main(String args[]) throws Exception{ //ヘッダ行が//start, トレーラ行が//endのテキスト処理を行う new FileReadTest().read(FILE_PATH,new ParamBean("//start","//end")); //ヘッダ行が//start1, トレーラ行が//end1のテキスト処理を行う new FileReadTest().read(FILE_PATH,new ParamBean("//start1","//end2")); } public void read(String filePath,ParamBean p) throws Exception{ BufferedReader in = new BufferedReader(new FileReader(filePath)); String line = null; while((line=in.readLine())!=null){ if( checkConStrEdit(line,p) .editStr(line,p) .tearminate(p)) break; } in.close(); } //テキストファイル処理の制御を行う protected FileReadTest checkConStrEdit(String str,ParamBean parm){ //ヘッダ行を読み込んだ時、ヘッダファイルを読み込んだことを示すフラグをセットする parm.isStarted = parm.isStarted || parm.fromStr.equals(str); //ヘッダ行を読み込んだ時、かつ、トレーラー行を読み込んでいない場合、処理中であることを示すフラグを立てる parm.isReading = parm.isStarted && !parm.fromStr.equals(str) && !parm.toStr.equals(str); //トレーラー行を読み込んだことを示すフラグを立てる parm.isEnd = parm.toStr.equals(str); return this; } //テキストファイル処理を行う protected FileReadTest editStr(String str,ParamBean param){ if(!param.isReading)return this; param.list.add(Arrays.asList(str.split(",")) .stream() .mapToInt(Integer::parseInt).sum()); return this; } protected boolean tearminate(ParamBean parm){ if(!parm.isEnd)return false; parm.list.stream().forEach(System.out::println); parm.initialize(); return true; } public static class ParamBean{ //次の行からテキスト処理を開始するヘッダを表す public final String fromStr; //テキスト処理を終了するトレーラを表す public final String toStr; //ヘッダ行を読み込んだかどうか識別するためのフラグ public boolean isStarted; //テキスト処理中を識別するフラグ public boolean isReading; //テキスト処理の終了を識別するフラグ public boolean isEnd; //テキスト処理をした結果を格納するリスト public List list =new ArrayList(); public ParamBean(String fromStr,String toStr){ this.fromStr = fromStr; this.toStr=toStr; } public void initialize(){ isStarted=false; isReading=false; isEnd=false; list =new ArrayList(); } } }