0

我有一个非常大的文本文件,其中包含一行以特定格式和可预测的“代码”开头,后跟一行或多行文本,然后是另一个代码行,后跟一行或多行文本。我的目标是从这个混乱中创建一个csv包含代码行作为第一个字段的文件,然后创建一个包含代码后面所有行的第二个字段,直到遇到下一个代码行。如果我也可以在第二个字段中包含代码行,那真的很有帮助。但如果不可能......

所以我的文本文件类似于:

54-332
line of text 1
line of text 2
line of text 3
54-334
line of text 1
line of text 2
line of text 3
line of text 4

我正在寻找一个CSV可导入的文件,Excel或者MySQL应该类似于:

"54-332","line of text 1 line of text 2 line of text3"
"54-334","line of text 1 line of text 2 line of text3 line of text4"

我已经能够编写识别代码的部分,但对如何完成其​​余部分感到困惑。文本没有可靠的字段分隔符,只有记录分隔符(代码)。

感谢大家。

4

2 回答 2

4

神秘但可以完成工作:

$ awk '{$1=q s q","q $1;$0=$0q;s=RT}NR>1' RS="[0-9]{2}-[0-9]{3}" q='"' file
"54-332","line of text 1 line of text 2 line of text 3"
"54-334","line of text 1 line of text 2 line of text 3 line of text 4" 
于 2013-09-14T19:38:45.390 回答
0

这个 Ruby 脚本也可以提供帮助。将输入转换为 CSV 格式是安全的,包括带有双引号的格式。

#!/usr/bin/env ruby

require 'csv'

a = []
r = Regexp.new(/^[[:digit:]]+-[[:digit:]]+.[[:digit:]]+$/)
o = { :force_quotes => true }

File.open(ARGV.shift).each_line do |l|
  l.chomp!
  if r =~ l && !a.empty?
    t = [a.shift]
    t << a.join(' ') unless a.empty?
    puts t.to_csv(o)
    a.clear
  end
  a << l
end

if !a.empty?
  t = [a.shift]
  t << a.join(' ') unless a.empty?
  puts t.to_csv(o)
end

如有必要,您可以更改正则表达式。要运行脚本,请执行以下操作:

ruby script.rb file > output.csv

另一方面,此脚本将确保始终有两列:

#!/usr/bin/env ruby

require 'csv'

r = Regexp.new(/^[[:digit:]]+-[[:digit:]]+.[[:digit:]]+$/)
o = { :force_quotes => true }

a = []
b = []

File.open(ARGV.shift).each_line do |l|
  l.chomp!
  if r =~ l
    puts [a.shift, b.join(' ')].to_csv(o) unless (a.empty? && b.empty?)
    a = [l]
    b.clear
  else
    b << l
  end
end

puts [a.shift, b.join(' ')].to_csv(o) unless (a.empty? && b.empty?)
于 2013-09-15T20:00:17.593 回答