Ruby:不同列中的每一行

时间:2013-06-21 23:16:36

标签: ruby parsing csv text

我是Ruby的新手,我有以下代码:

out_file = File.open('new1.csv', 'w')
File.open("new7.txt").each do |line| 
  if line =~ /Revision/ then
    out_file.puts line
  elsif
    line =~ /Author/ then
    out_file.puts line
  elsif
    line =~ /Date/ then
    out_file.puts line
  end
end

我需要:

  • 带有“Revision”的行放在输出CSV文件的A列
  • “作者”一行放在B栏
  • 第C栏中带有“日期”的行
  • 等等

有人能告诉我如何按照描述将数据放入列中吗?

现在所有行都放在一行。

“new7.txt”的样本

Revision: 37407
Author: imakarov
Date: 21 June 2013 г. 10:23:28
Message:
update specification from Jhon (it was in VTBSOATST-1219)
----
Added : /Analitics/Документы/ЧТЗ/BR-5610/2 Спецификации/BR-5610 Публикация клиентских данных в АБС Бисквит (CifOraSyncOffPers).docx
Deleted : /Analitics/Документы/ЧТЗ/BR-5610/2 Спецификации/BR-5610 Публикация клиентских данных в АБС Бисквит.docx

Revision: 37406
Author: imakarov
Date: 21 June 2013 г. 10:22:16
Message: 
delete files

----
Deleted : /Analitics/Документы/ЧТЗ/BR-5610/2 Спецификации/ЧТЗ Принудительное обновление и публикация ФЛ с замечаниями Кочебина С..docx
Deleted : /Analitics/Документы/ЧТЗ/BR-5610/2 Спецификации/ЧТЗ Принудительное обновление и публикация ФЛ-comments.docx
Deleted : /Analitics/Документы/ЧТЗ/BR-5610/2 Спецификации/ЧТЗ Принудительное обновление и публикация ФЛ-comments_Орлов.docx
Deleted : /Analitics/Документы/ЧТЗ/BR-5610/2 Спецификации/ЧТЗ Принудительное обновление и публикация ФЛ.docx

Revision: 37405
Author: dboytsov
Date: 21 June 2013 г. 10:21:17
Message:
add attributes in file
----
Modified : /Analitics/Документы/ЧТЗ/BR-5864 Запрос данных клиента по интернет-анкете КН/Преобразование BR-5864.docx
Modified : /Analitics/Документы/ЧТЗ/BR-5864 Запрос данных клиента по интернет-анкете КН/ЧТЗ BR-5864 Запрос данных клиента по интернет анкете.docx

可能是更好的方式导出.xls? 在每个列中的.xls文件中导出是否很难?

现在我有以下情况: enter image description here

但我需要: enter image description here

2 个答案:

答案 0 :(得分:2)

使用csv库。假设new7.txt具有作者,修订版,日期的列顺序,您可以执行以下操作:

require 'csv'

# parse the csv file into an array

CSV.parse("new7.txt", {:headers => false}).each do |line|

  # assign each 'cell' to a variable

  auther = line[0]
  revision = line[1]
  date = line[2]

  # append the newly order data onto a new csv file

  CSV.open("new7_revised.txt", "a") do |csv|
    csv << [revision, author, date]
  end
end

答案 1 :(得分:1)

鉴于OP提供的信息,

require 'csv'

data = []
File.foreach("new7.txt") do |line|
  line.chomp!
  if line =~ /Revision/
    data.push [line]
  elsif line =~ /Author/
    if data.last and not data.last[1]
      data.last[1] = line
    else
      data.push [nil, line]
    end
  elsif line =~ /Date/
    if data.last and not data.last[2]
      data.last[2] = line
    else
      data.push [nil, nil, line]
    end
  end
end

CSV.open('new1.csv', 'w') do |csv|
  data.each do |record|
    csv << record
  end
end
  • 应该顺序排列的行:修订版,作者,日期,修订版,日期,作者,修订版,......
  • 如果订单不合理:
    • Revision行被视为新记录的开头
    • 如果2 Revision(或Author)行之间没有Date行,则会考虑第二行Author(或Date)行成为新纪录。