2012-06-28 2 views
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 

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

Смежные вопросы