2012-06-28 2 views
0

저는 Ruby에 처음으로 익숙하며 프로그램에 도움이 될 수 있습니다. 나는 많은 데이터 행이 여러 개의 텍스트 파일을 포함하는 zip 파일을 열어야합니다 (예.)Zip 파일 구문 분석 및 텍스트 파일에서 레코드 추출

CDI|3|3|20100515000000|20100515153000|2008|XXXXX4791|0.00|0.00 
CDI|3|3|20100515000000|20100515153000|2008|XXXXX5648|0.00|0.00 
CHO|3|3|20100515000000|20100515153000|2114|XXXXX3276|0.00|0.00 
CHO|3|3|20100515000000|20100515153000|2114|XXXXX4342|0.00|0.00 
MITR|3|3|20100515000000|20100515153000|0000|XXXXX7832|0.00|0.00 
HR|3|3|20100515000000|20100515153000|1114|XXXXX0238|0.00|0.00 

내가 먼저 zip 파일에있는 텍스트 파일을 읽고 쓰기 만, zip 파일을 추출해야 (CDICHO)로 시작하는 전체 행은 CDI으로 시작하는 데이터 행에 대해 하나, CHO (기본적으로 파일 구문 분석)으로 시작하는 데이터 행에 대해 하나씩 두 개의 출력 파일로 구성됩니다. 나는 루비와 함께 그것을 할 필요가 아마도 동일한 키의 연속 zip 파일의 도착에 대한 자동 기능으로 프로그램을 설정하려고합니다. 누군가가 줄 수있는 샘플을 통해 조언, 지시 또는 도움을 전적으로 감사드립니다.

답변

0

한 가지 방법은 ZipFile 라이브러리를 사용하는 것입니다.

require 'zip/zip' 

# To open the zip file and pass each entry to a block 
Zip::ZipFile.foreach(path_to_zip) do |text_file| 
    # Read from entry, turn String into Array, and pass to block 
    text_file.read.split("\n").each do |line| 
     if line.start_with?("CDI") || line.start_with?("CHO") 
     # Do something 
     end 
    end 
end 
+0

고맙습니다. 열려있을 때 zip 파일에 특정 행만 출력해야하는 데이터가있는 6 개의 개별 텍스트 파일이있는 경우 조정해야 할 것이 있습니까? 지금까지 귀하의 모든 도움에 진심으로 감사드립니다. Jay – user1487077

+0

아니요.'Zip :: ZipFile.foreach'는 실제로 zip 파일의 모든 항목에 대한 코드를 실행합니다. 이 방법을 사용하여 수천 개의 항목이있는 zip 파일을 반복합니다. –

+0

참고 : 위 코드는 실제로 zip 파일을 추출하지 않습니다. 각 항목을 검토하고 내용을 읽지 않고 내용을 분석합니다. 먼저 압축을 풀 필요가있는 경우 해당 라이브러리에 연결된 메소드가 있습니다. –

0

귀하의 질문에 전적으로 따르는 지 확실하지 않습니다. 처음에는 Ruby를 사용하여 파일을 압축 해제하려는 경우 this question을 확인하십시오. 파일을 읽을 수있는 형식으로 압축을 풀면 다음 줄을 따라 두 개의 개별 출력으로 인쇄 할 수 있습니다.

cdi_output = File.open("cdiout.txt", "a") # Open an output file for CDI 
cho_output = File.open("choout.txt", "a") # Open an output file for CHO 

File.open("text.txt", "r") do |f|   # Open the input file 
    while line = f.gets      # Read each line in the input 
    cdi_output.puts line if /^CDI/ =~ line # Print if line starts with CDI 
    cho_output.puts line if /^CHO/ =~ line # Print if line starts with CHO 
    end 
end 

cdi_output.close       # Close cdi_output file 
cho_output.close       # Close cho_output file 
+0

대단히 감사합니다. 두 예제 모두를 사용해 보겠습니다. 멋진 출발점처럼 보입니다. 멀리 zip 파일에 대한 내 질문까지. Ruby를 프로그래밍하여 새로운 zip 파일이 언급 된 데이터로 전자 메일을 통해 도착한 다음 출력 단계를 진행할 때 파일의 압축을 자동으로 풀고 싶습니다. 지금까지 모든 도움에 감사드립니다. Jay – user1487077

관련 문제