【问题标题】:Ruby: each line in different columnRuby:不同列中的每一行
【发布时间】:2013-06-19 04:45:11
【问题描述】:

我是 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

我需要:

  • 输出 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文件中导出是不是很困难?

现在我有以下情况:

但我需要:

【问题讨论】:

  • 你能发一份你的源文件样本('new7.txt')吗?
  • 如果没有您的输入文件样本,我们只能猜测您需要什么。这对你没有任何好处,而且会浪费我们的时间。
  • @the Tin Man 对不起。现在我更新帖子。添加示例

标签: ruby parsing csv text


【解决方案1】:

使用csv 库。假设new7.txt 的列顺序为 Author、Revision、Date,您可以执行以下操作:

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

【讨论】:

  • 这似乎与问题不匹配,new7.txt 中的输入数据不是 CSV 格式。有些行包含“Revision”,有些行包含“Author”等。
  • 啊,我以为 OP 想要重新排序列。
  • @DarshanComputing 是的,你是对的。输入的“new7.txt”文件不是 csv,它只是一个 txt。在里面我有诸如“修订”“作者”“日期”之类的词。在输入文件中,它不是一列。我想解析输入文件并按列复制到csv
【解决方案2】:

鉴于 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 行被视为新记录的开始
    • 如果两行Author(或Date)之间没有Revision行,则第二行Author(或Date)将被视为在新记录中。

【讨论】:

  • 非常感谢!我试过了,但现在它把所有东西放在一排。但我需要分别放入每一列。
  • @DmitryBoytsov 在编写 CSV 文件时,我已将 File.open 替换为 CSV.open。每条记录将单独写在一行中,而不是全部连接在一行中。
  • 我已经检查了您提供的示例数据,它应该可以正常工作。请注意,您需要使用 csv 库将数据存储在 CSV 文件中,就像我编写的代码一样。
  • 好的,我又试了一次 :) 但是如果我不需要加入一行呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多