4

私は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列に「Revision」が入っている行
  • 列 B に「作成者」を入力した行
  • C列に「日付」を入れた行
  • 等々

説明されているようにデータを列に入れる方法を誰か教えてもらえますか?

現在、すべての行が 1 行に配置されています。

「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 ファイルでエクスポートするのは難しいですか?

今、私は次のような状況にあります: ここに画像の説明を入力

しかし、私はそれが必要です: ここに画像の説明を入力

4

2 に答える 2

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
于 2013-06-21T23:30:55.820 に答える
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行の間に行がない場合、2 行目(または) 行は新しいレコードにあると見なされます。AuthorDateAuthorDate
于 2013-06-22T02:53:17.433 に答える