Разбор Zip-файла и извлечение записей из текстовых файлов

Я действительно новичок в 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-файле, и записать только полные строки, начинающиеся с (CDI а также CHO) до двух выходных файлов, один для строк данных, начинающихся с CDI и один для строк данных, начинающихся с CHO (в основном разбор файла). Я должен сделать это с Ruby и, возможно, попытаться настроить программу на автоматическую функцию для получения непрерывных zip-файлов того же уровня. Я полностью ценю любой совет, направление или помощь через образец, который может дать каждый.

2 ответа

Решение

Одним из способов является использование библиотеки 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

Я не уверен, что полностью следую вашему вопросу. Для начала, если вы хотите разархивировать файлы с использованием 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
Другие вопросы по тегам