Ruby 如何在行尾使用分号修复CSV读取错误

Ruby 如何在行尾使用分号修复CSV读取错误,ruby,csv,Ruby,Csv,我想使用Ruby的CSV类读取文件: 要读取的文件如下所示: CM_ SG_ 1325 XXX_Address "XXX address"; CM_ SG_ 612 YYY_MsgCounter "incremented by 1 each time a message has been transmitted"; 我的ruby代码: #!/usr/bin/env ruby require 'pp' require 'csv' CSV.foreach(ARGV[0],:col_sep=>

我想使用Ruby的CSV类读取文件:

要读取的文件如下所示:

CM_ SG_ 1325 XXX_Address "XXX address";
CM_ SG_ 612 YYY_MsgCounter "incremented by 1 each time a 
message has been transmitted";
我的ruby代码:

#!/usr/bin/env ruby
require 'pp'
require 'csv'
CSV.foreach(ARGV[0],:col_sep=>" ") do |row|
    pp row
end
这是我得到的错误:

C:/ruby-2.3.3-x64-mingw32/lib/ruby/2.3.0/csv.rb:1898:in `block in shift': Unclosed quoted field on l
ine 1. (CSV::MalformedCSVError)
        from C:/ruby-2.3.3-x64-mingw32/lib/ruby/2.3.0/csv.rb:1805:in `loop'
        from C:/ruby-2.3.3-x64-mingw32/lib/ruby/2.3.0/csv.rb:1805:in `shift'
        from C:/ruby-2.3.3-x64-mingw32/lib/ruby/2.3.0/csv.rb:1747:in `each'
        from C:/ruby-2.3.3-x64-mingw32/lib/ruby/2.3.0/csv.rb:1131:in `block in foreach'
        from C:/ruby-2.3.3-x64-mingw32/lib/ruby/2.3.0/csv.rb:1282:in `open'
        from C:/ruby-2.3.3-x64-mingw32/lib/ruby/2.3.0/csv.rb:1130:in `foreach'
        from test.rb:4:in `<main>'
这就是我希望看到的

我假设问题是CSV不喜欢引号上的分号。有没有一种方法可以使用CSV选项来删除分号,或者在我已经删除分号的地方给CSV一个流

澄清:


很抱歉,最初没有指定这一点,但并非每一行都有分号


此外,我还要感谢Tin Man对我的帖子进行了多余的编辑,以提高他的分数

对于Ruby 2.6.1,试试这个:

require 'pp'
require 'csv'

CSV.foreach(ARGV[0], col_sep: ' ', row_sep: :auto, liberal_parsing: {double_quote_outside_quote: true} ) do |row|
    pp row
end

它似乎起作用了。请参阅此问题:

因为您知道每行都以分号结尾,所以只需指定行分隔符,例如

CSV.foreach(ARGV[0],col_sep:" ", row_sep:";").to_a
#=> [["CM_", "SG_", "1325", "XXX_Address", "XXX address"], 
#    ["CM_", "SG_", "612", "YYY_MsgCounter", "incremented by 1 each time a message has been transmitted"]]
您将丢失行中的新行,但不确定这有多重要


注意:根据我与@iGian的讨论,此解决方案适用于ruby<2.6.0,而他的解决方案适用于>=2.6.0

在您的文件中,这是跨两行的吗?“每次发送消息时递增1”是的,Sara,引用的字符串中有一个换行符。你测试过它吗,因为它对我不起作用,而且它似乎不适用于这种情况,因为没有双引号strings@engineersmnky,是的,我做了,它在我的环境中工作(Ruby 2.6.1)。我首先测试了您发布的确切解决方案,在第2行中得到了有意义的消息。(CSV::Malformedcsvrorer)。当我使用
而不是
:auto
我得到
除了第1行中引用的字段后的col\u sep\u split\u分隔符之外,不允许使用。但我现在意识到这是由于Ruby版本。我要编辑。这很奇怪,我可以确认你在
2.6.1
中的发现,但是在
2.6
(测试
2.5.1
2.3.3
2.1.5
1.9.3
)我的工作如下所述。我真的很喜欢这个有意义的信息:)旁注只是
liberal_解析:{}
也能起作用似乎只是钥匙必须存在于options@engineersmnky,新安装的2.6.3,出现与2.6.1相同的问题。是吗?我很抱歉最初没有指定,但不是每一行都有分号。@oaklodge鉴于这似乎不是真正的CSV,并且行尾没有标准,我不确定从这里到底去哪里。理论上,您可以去掉所有分号,并将结果字符串传递给
CSV.parse
,但我不确定这个文件有多大,这对您来说有多重要。也许试试这个
CSV.parse(File.read(ARGV[0]).gsub(“;”,”),col_sep:”)
我喜欢CSV,因为它在考虑引用元素的同时完成了重要的拆分工作。当我再次面对我的电脑时,我会尝试你的解决方案。我可能会作弊并创建一个临时文件,其中包含尾随分号。
CSV.foreach(ARGV[0],col_sep:" ", row_sep:";").to_a
#=> [["CM_", "SG_", "1325", "XXX_Address", "XXX address"], 
#    ["CM_", "SG_", "612", "YYY_MsgCounter", "incremented by 1 each time a message has been transmitted"]]