2013-10-28 4 views
1

두 파일을 동시에 반복하는 가장 좋은 방법은 무엇입니까? 따라서 file_1의 줄 57 == 'x'이면 file_2의 줄 57을이 방법으로 처리 할 수 ​​있습니까?두 파일을 반복 루비

아래에 내 코드가 작동하지 않습니다,하지만 간단한 해결책이 거기 밖으로 알고 ...

@blue = [] 
@red = [] 

file_1 = File.open('index.txt', 'r') 
file_2 = File.open('index2.txt', 'r') 

for item, line in file_1, file_2 
    @blue << line if item == "blue" 
    @red << line if item == "red" 
end 

file_1.close 
file_2.close 
+0

파일의 길이 (줄 수)가 다른 경우 어떻게해야합니까? –

+0

여기 루비를 따라갈 수는 없지만 아마 루비에 대한 나의 무지 함이 있습니다. 'item'은'file_1'의 줄이고,'line'은'file_2'의 줄입니까? – glenatron

+0

@ 글레나 트론 그래, 내 기본 전제가되었다 –

답변

2

. 두 파일의 동시 읽기를 필요로 귀하의 질문에, 나는 (공간 오버 헤드의 어떤 종류를 필요로하지 않는)이 제안합니다 들어

:

@blue = [] 
@red = [] 
#make the files enumerable. 
file_1 = File.open('index.txt', 'r').to_enum 
file_2 = File.open('index2.txt', 'r').to_enum 

loop do 
    #access next line in each file with .next 
    item = file_1.next 
    line = file_2.next 
    @blue << line if item.eql?('blue') 
    @red << line if item.eql?('red') 
end 

file_1.close 
file_2.close 

to_enum 객체에서 호출 할 때, 그것은 열거하게하고 여러 가지 열거 자 기능을 갖추고 있습니다. #next은 메소드에 내장 된 것 중 하나입니다.

위의 코드는 각 파일에서 한 줄씩 읽습니다. 루프는 어떤 파일이 다음 입력을 벗어나 자마자 종료됩니다.

+0

그것은 결코 좋은 습관이 아닙니까? – iamnotmaynard

+0

두 개의 파일 (각각 2GB)을 읽고 변수에 저장하는 것이 좋습니다. 파일이 그다지 크지 않더라도 하나의 파일과 함께 제공되면 어떻게 될까요? – kiddorails

+0

아니요, 각각 2GB의 파일 두 개를 읽는 것이 일반적으로 권장되지 않습니다 (그래도 문제가되지는 않지만). 10 억 건의 파일 읽기도 없습니다. 이 경우 프로그램은 SQL 또는 다른 데이터베이스 솔루션을 사용해야합니다. 그것은 ** 결코 ** 좋은 연습 인 이유에 대해 대답하지 않습니다; 파일이 비현실적으로 크지 않다면 괜찮습니다. – iamnotmaynard

2

내가 더 나은 방법이있을거야하지만,이 파일에 대한 IO#readlines 전화를 작동 및 zip 그들과 같이 :만큼 파일이 너무 큰 아니기 때문에

for item, line in file_1.readlines.zip(file_2.readlines) 

(즉, 매우 큰 ) 전체가 그들을 읽는 아무 문제가 없어야합니다. 예기치 않은 동작을 피하기 위해 파일의 행 수가 미리 같아야 할 수 있습니다.

+0

'매우 큰'을 정의하십시오. 내 시스템에 640k의 메모리가 있다면, 매우 큰 것은 전혀 크지 않으며, 1 메가 미만입니다. 32 기가의 램이 있다면, 매우 큰 것이 또 다른 일입니다. "매우 큰"가능성은별로 도움이되지 않습니다. – vgoff

+0

일반 사용자가 사용할 수있는 무언가를 작업하는 사람은 해당 시스템에서 파일이 '매우 큽니다'는 것을 고려해야합니다. 이것은 가설입니다. 그러나 이것은 다시 정의하기에는 너무 비례적인 것입니다. – kiddorails

+0

@vgoff "Very large"는 실행중인 시스템에 비해 매우 큰 것을 의미합니다. 주관적이지만, 당신이 그것을 볼 때 그것을 알 것입니다. 나는 OP가 100 만 줄의 파일에이 용도로 쓰이는 것을 의심하고있다. 또한 시스템에 640k가 있으면 Ruby를 실행할 수 있습니다. – iamnotmaynard

1

File.readlines()을 사용하여 각 파일에서 배열을 만든 다음 파일 데이터를 직접 사용하지 않고 배열에서 작업하는 것이 더 쉽습니다. 아마 이런 식으로 뭔가 : 그것은 이동에 전체 파일을 읽어와 변수에 그것을 배치 할 결코 것이 좋습니다

@blue = [] 
@red = [] 

file_1 = File.open('index.txt', 'r') 
file_2 = File.open('index2.txt', 'r') 

red_vs_blue = file_1.readlines() 
lines = file_2.readlines() 

red_vs_blue.zip(lines) 

red_vs_blue.each do | item, line | 
    @blue << line if item == "blue" 
    @red << line if item == "red" 
end