我有一个非常大的文本文件,其中包含一行以特定格式和可预测的“代码”开头,后跟一行或多行文本,然后是另一行代码,后跟一行或多行文本。我的目标是从这个混乱中创建一个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"
我已经能够编写识别代码的部分,但是我很难知道如何完成剩下的工作。文本没有可靠的字段分隔符,只有记录分隔符(代码)。
谢谢大家。
答案 0 :(得分: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"
答案 1 :(得分: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?)