テキストデータを読み込み、重複部分(重複行)以外を出力する。

概要

  • 読み込んだテキストデータ(テキストファイル)を、重複部分(重複行)を削-除して出力する。
  • 出力する際に、grepキーワードを含む行だけを抽出して出力する。
  • grepするキーワード数は2つ

ロジック

  • readyメソッド
    • 入力するファイルのパスを指定
    • 出力するファイルのパスを指定
    • grepキーワードを指定
  • readメソッド
    • readyメソッドで指定したファイルパス(private static 変数)を使って入出力ファイルを読み込む
    • whileループにより、文末まで読み込みを続ける。ArrayList uniqLineに同じものがあった(既に読み込まれていた)場合にはuniqLineからその行を削除する。
    • grepキーワード有無の判断はindexOf(int ch)で行う。該当する文字が String str にあれば-1以外と評価されるので、 それ以外ならArrayListに追加する。
  • writerメソッド
    • for (String s : uniqLines) によって、uniqLinesの要素を順番に書き出す。
  • -
import java.util.*;
import java.io.*;

public class UniqLineOutput {

	private static ArrayList<String> uniqLines 
		= new ArrayList<String>();				// ユニークな行を格納するArrayList
	private static String str;					// 読み込んだ1行を格納する
	private static String inputFileName;		// 入力するファイルパス
	private static String outputFileName;		// 出力するファイルパス
	private static File inputFile;				// パスを受けて入力するファイル
	private static File outputFile;				// パスを受けて出力するファイル
	private static String grepKeyword1;			// grepキーワード1
	private static String grepKeyword2;			// grepキーワード2
	private static BufferedReader stdIn = 
		new BufferedReader(
		new InputStreamReader(System.in));		// 文字列読み込み用
	private static BufferedReader br = null;	// ファイルを読み込む
	private static BufferedWriter bw = null;	// ファイルに書き込み
	
	public static void main(String[] args) {
		UniqLineOutputTest_02 UniqLineOutputTest02 = new UniqLineOutputTest_02();
		UniqLineOutputTest02.ready();
		UniqLineOutputTest02.read();
		UniqLineOutputTest02.writer();
		System.out.println("END");
	}
	
	public void ready() {
		System.out.println("読み込みたいテキストファイルのパスを入力してください");
		try {
			inputFileName = stdIn.readLine();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("出力するファイルのファイル名を入力してください。\n"
							+ "ディレクトリを指定して作成する場合は、\n"
							+ "作成先ディレクトリのパスを指定してください。\n"
							+ "上記以外はカレントディレクトリに作成します。");
		try {
			outputFileName = stdIn.readLine();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println("Grepするキーワード1を入力してください");
		try {
			grepKeyword1 = stdIn.readLine();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("Grepするキーワード2を入力してください");
		try {
			grepKeyword2 = stdIn.readLine();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void read() {
		inputFile = new File(inputFileName);
		outputFile = new File(outputFileName);
		try {
			br = new BufferedReader(new FileReader(inputFile));
			bw = new BufferedWriter(new FileWriter(outputFile));
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
		try {
			while ((str = br.readLine()) != null) {
				if (uniqLines.contains(str) == true) {
					uniqLines.remove(str);
				} 
				else if ((str.indexOf(grepKeyword1) != (-1)) | (str.indexOf(grepKeyword2) != (-1))) {
					uniqLines.add(str);
				}
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		catch (Error er){
			er.printStackTrace();
		}
	}
	
	public void writer() {
		try {
			for (String s : uniqLines) {
				bw.write(s);
				bw.newLine();
				bw.flush();
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		} 
		finally {
			try {
				stdIn.close();
				bw.close();
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}