2011-10-25 21 views
1

我有一个恶意格式.csv文件,这是由一些额外的\n引起的。例如:红宝石正则表达式删除额外 n

Name,Comment 
"Peter","Good morning" 
"Paul","How are you 
" 
"Mary","Fine" 

第2行以不需要的额外\n结尾。

如何删除所有尾随\n s后面没有后跟双引号"(假设整个文件已被读入字符串)?

回答

5

不要将整个东西读入字符串,请使用标准CSV parser in 1.9来读取它。如果你有,比如说,pancakes.csv,则:

require 'csv' 
data = CSV.open('pancakes.csv').map { |r| r.map(&:strip) } 
# or 
data = CSV.open('pancakes.csv').map { |r| r.map(&:chomp) } 

然后你就在data有这样的:

[ 
    ["Name", "Comment"], 
    ["Peter", "Good morning"], 
    ["Paul", "How are you"], 
    ["Mary", "Fine"] 
] 

所以,你可以让你的数据都是干净的,并很好地解析很简单。如果你只需要清理一些其他无法处理嵌入换行符的程序的CSV,那么你可以使用CSV将它重新写回。

+0

由于某种原因,我必须留在1.8.7和使用'fastercsv'。 'fastercsv'中有类似吗?谢谢! – ohho

+0

@ohho:AFAIK 1.9的'csv'只是'fastercsv'和一些Unicode补丁,所以它应该和1.8中的'fastercsv'一样。 –

+0

它给出与'F​​asterCSV.foreach'相同的错误,即:'FasterCSV :: MalformedCSVError(FasterCSV :: MalformedCSVError)' – ohho

-1

为什么不只是为不以双引号结尾的行添加尾随双引号,并删除空行(只有双引号的行)?

-1

你不需要Regexp。这基本上是在自己的行上的任何双引号:

csv_string.gsub("\n\"\n", "\"\n") 
+0

Downvoted?Harsh :) – d11wtq