2011-09-07 5 views
1

텍스트 파일 인 foo.txt는 10 자리 숫자의 목록 인 각각의 행에 있습니다. 숫자가 특정 매개 변수 세트를 충족하면 그 행을 bar.txt로 작성합니다.텍스트 파일 읽기 및 Ruby의 다른 텍스트 파일에 쓰기

바로 가기 루비에서이 작업을 수행하는 가장 쉬운 방법은 무엇입니까? Ruby에서 파싱을 파일로 작성하는 데 익숙하지 않고 시작하려면 약간의 도움이 필요합니다.

답변

2

죄송합니다. 여기 코드 골프를 거부 할 수 없습니다.

$ ruby -e 'ARGF.each {|line| puts line if line =~ /9/}' < foo.txt 
: 다음 명령 줄 주문에 숫자 9를 포함하는 모든 라인을 표준 출력이 파일 출력을 읽을 수

3588888932 
4783748387 
3434934343 
4344232322 
4343343439 
1111132333 

:

은 다음과 같습니다 파일에 foo.txt을 감안할 때 다른에 기록해야하는 경우

이것은 물론

3588888932 
3434934343 
4343343439 

를 출력 파일, 당신은

$ ruby -e 'ARGF.each {|line| puts line if line =~ /9/}' <foo.txt> bar.txt 

는 일반적으로 파일에서 라인의 필터링 (나는 ARGF을 사용 여기) 표준 입력을 통해 수행 최고의 뭔가 말할 수 있지만, 경우에 루비의 파일 방법을 사용하는 것도 물론 가능하다 이 작업은 더 큰 Ruby 애플리케이션의 일부로 수행되어야합니다.

일반적인 접근 방식은 여기에 그래서 당신은 리디렉션 할 수 bar.txt에 쓰기를,

File.open("foo.txt", "r") do |f| 
    while (line = f.gets) 
     puts line if line =~ /9/ 
    end 
end 

이 표준 출력에 기록합니다. Ruby에 대한 좋은 점은 블록 매개 변수이기 때문에 파일이 블록이 종료 될 때 자동으로 닫힙니다.

블록 내에서 파일을 열어 파일에 쓸 수도 있습니다. foo.txt를 읽고 bar.txt에 글을 쓰려면 Paul의 대답을 참조하십시오. 당신과 같이 일을 할 수있는 응용 프로그램에서

2

:

File.open("output.txt", "w") do |out| 
    IO.readlines("input.txt").each do |line| 
    if (line =~ /^1/) 
      out.puts(line) 
    end 
    end 
end 

당신은 당신이 대신 "w"의 "R"을 사용할 수있는 출력처럼 입력을 열려면

.

readlines 메서드는 전체 파일을 한꺼번에 읽으므로 큰 파일의 경우 가장 좋은 아이디어는 아니지만 작은 아이디어의 경우 큰 문제는 아니며 쉽습니다. 블록이 핸들을 처리하는 방법에 유의하십시오.

관련 문제