본문 바로가기

개발언어/JavaFunction

자바 람다식으로 파일 읽고 특정 텍스트 부분만 추출하기

자바 람다식으로 텍스트 파일을 읽은 뒤 특정 텍스트 추출하기 (tistory.com)

 

자바 람다식으로 텍스트 파일을 읽은 뒤 특정 텍스트 추출하기

현재 프로젝트의 분석 설계 단계에 들어가서 분석 설계 작업중이다. 이전 시스템 소스를 보고 해당 함수의 이름과 기능을 추출해야하는데 하나하나 소스를 열어서 해당 함수를 찾아서 드래그

www.goodsource.co.kr

이전에 람다식으로 파일을 읽어 텍스트를 추출하는 Function을 작성 한 적이 있는데

 

실무에서 사용을 하다보니 문제가 있엇다.

 

한국어의 특성상 인코딩 방식 때문에 파일을 열어서 텍스트를 추출하지 못했던게 원인이어서

 

텍스트를 추출하는 것이 불가능했다.

 

그래서 실무에서 해당 소스코드를 적용하려면 소스코드를 조금 수정 할 필요가 있다.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class Lamda {
    public static void main(String[] args) throws IOException {

        List<String> fileList = new ArrayList<>();
        Files.newDirectoryStream(Paths.get("D:\\다운로드"), path -> path.toString().endsWith("c")).forEach(path->fileList.add(path.toString()));

        List<String> outputFile = new ArrayList<>();

        for(String fileName : fileList){
            try{

                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "euc-kr"));
                outputFile.add("파일명"+fileName);

                br.lines().filter(line -> line.contains("SELECT"))
                          .map(line->line.replaceAll("\t", ""))
                          .forEach(outputFile::add);
            }catch(Exception e){}
        }

        outputFile.forEach(System.out::println);
        Files.write(Paths.get("c:/output.txt"), outputFile);
    }
}

 

우선 Files.newDirectoryStream을 이용하여 해당 디렉터리에 있는 파일 목록들을 추출한다. endsWith("c")는 c 확장자로 끝나는 파일 목록들을 찾겠다는 이야기이다.

그다음 fileList.add(path.toString()); 문구는 찾아낸 파일 목록들을 fileList에 저장하겠다는 의미이다.

List<String> outputFile = new ArrayList<>(); 이 문구는 파일을 읽고 난 뒤에 정제된 파일 내용을 담기 위해 선언한 것이다.

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "euc-kr"));

위의 문구에는 한글 내용이 포함된 파일을 읽기 위해 "euc-kr"이 작성된 것을 볼 수 있다.

br.lines()를 통해 SELECT라는 문구가 포함된 라인을 추출하고 outputFile 리스트 안에 담는다.

 

outputFile.forEach(System.out::println)문구가 실행되면 실제 본인이 정제한 내용들을 출력한다.

 

Files.write(Paths.get("c:/output.txt"), outputFile);가 실행되면 실제 본인이 정제한 내용들을 c:/output.txt에 작성한다.