텍스트 파일 내의 문자열 바꾸기

조회수 4950회

지금 텍스트 파일에 있는 문자열을 커맨드 라인 상으로 입력 받아서 바꾸는 문제를 풀고 있는데, 가장 처음에 검색된 문자열과 가장 마지막에 검색된 문자열은 바꾸려고 하는 문자열이 아닌 다른 특정한 문자열로 출력되어야 합니다. 여기서 마지막에 검색된 문자열을 바꾸는 과정을 모르겠네요. `

public static void main(String[] args)throws Exception{
    int count=0;
    if(args.length!=3){
        System.out.println("Usage: java ReplaceText targetFile oldStr newStr");
        System.exit(1);
    }
    File SourceFile = new File("in.txt");
    if(!SourceFile.exists()){
        System.out.println("SourceFile does not exist");
        System.exit(2);
    }
    File targetFile = new File(args[0]);
    try(Scanner input = new Scanner(SourceFile);
        PrintWriter output = new PrintWriter(targetFile);
        ){
        String arr[];
        String same[];
        while(input.hasNext()){
            String s1 = input.nextLine();
            String s2 = s1.replaceAll(args[1], "%%%");
            output.println(s2);
            count++;
            if(s1.equals(args[1])){
                break;
            }
        }
        while(input.hasNext()){
            String s1 = input.nextLine();
            String s2 = s1.replaceAll(args[1], args[2]);
            output.println(s2);
            if(s1.equals(args[1])){
                count++;    
            }
        }
    }
    System.out.println(args[1]+" : "+count);
}

현재 짜 놓은 코드도 첨부드립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 라인단위로 처리하려고 하면 힘듭니다. 파일 전체 내용을 가지고 처리하세요

    • 파일의 내용을 String 변수에 저장하기

      -> import java.nio.charset.*;
      -> import java.nio.file.*;
      -> String contents = new String(Files.readAllBytes(Paths.get(".profile")), Charset.defaultCharset()); // contents 는 전체 파일 내용
      
    • 변경한 내용을 새로운 파일 생성후 쓰기

      -> import java.nio.file.*;
      -> Files.write(Files.createFile(Paths.get("mytest.txt")), contents.replaceFirst("HOME", "HOUSE").getBytes())
      

    그런데 String 에는 replaceFirst 는 있는데 replaceLast 는 없습니다.

    만들어써야죠.

    replaceLast 는 없지만 lastIndexOf 가 있어서 마지막 단어의 위치를 알 수 있습니다.

    contents 는 검색하려는 본문

    searchWord 는 검색단어

    replacement 는 변환할 단어

    • 참고로 replaceLast 는 인터넷 검색하면 많이 나옵니다. 아래의 소스도 그중에 하나입니다.
    public static String replaceLast(String contents, String searchWord, String replacement) {
        int regexIndexOf = contents.lastIndexOf(searchWord);
        if(regexIndexOf == -1){  // 존재하는 검색 단어가 없으면 문자열 그대로 반환
            return contents;
        }else{
            return contents.substring(0, regexIndexOf) + replacement + contents.substring(regexIndexOf + searchWord.length());
        }
    }
    

    이정도 준비되면 과제 처리할 수 있을거라 봅니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)