0

我对 Ruby 真的很陌生,可以在程序上使用一些帮助。我需要打开一个包含多个文本文件的 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(基本上解析文件)开始。我必须用 Ruby 来做这件事,并且可能会尝试将程序设置为自动功能,以接收相同大小的连续 zip 文件。我完全感谢任何人都可以提供的一些示例的任何建议、指导或帮助。

4

2 回答 2

0

我不确定我是否完全遵循您的问题。对于初学者,如果您希望使用 Ruby 解压缩文件,请查看此问题。将文件解压缩为可读格式后,您可以尝试按照以下方式打印到两个单独的输出:

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
于 2012-06-28T16:37:01.580 回答
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
于 2012-06-28T16:32:57.257 回答