【问题标题】:Ruby/Rails, Parsing CSV with line break between quotesRuby/Rails,用引号之间的换行符解析 CSV
【发布时间】:2016-01-01 02:50:54
【问题描述】:

有没有办法告诉 CSV 对象引号之间的换行符不是行分隔符?

我的 CSV 文件是:

"a","b","c"
1,"some
text with line break",21
2,"blah",4

我的代码是:

CSV.foreach(file_path, headers: true) do |row|
  puts row
end

我希望它只返回两行,但它返回三行。

【问题讨论】:

  • 如果换行符不是行分隔符,那是什么?
  • 换行符是行分隔符,但是当引号之间出现新行时,例如。 "asd \n asdf" 它不应被视为两行。
  • 它返回精确的三行 - 这是它应该工作的方式。但如果您的评论不正确,可能会返回四个。以其他方式,您的所有行都会建议为一行...不是吗?
  • 您可以使用正则表达式预处理引号内的每个文本部分并删除任何内部“\n”
  • 不包括标题返回三行:[["1","some"],["text with line break", "21"],["2","blah","3 "]]。我希望它返回两行: [["1", "some\n text with line break","21"], ["2","blah","4"]

标签: ruby-on-rails ruby csv


【解决方案1】:

您(错误地)通过打印行数来判断行数。它返回 两个。去图:

[4] pry(main)> CSV.foreach('example.csv', headers: true).to_a
=> [
 #<CSV::Row "a":"1" "b":"some\ntext with line break" "c":"21">,
 #<CSV::Row "a":"2" "b":"blah" "c":"4">
]

您的代码输出三行,因为您正在打印行并且换行符按原样打印。这使它看起来好像一排变成了两排。 以同样的方式思考,我会说您的源 CSV 包含 4(四!)行。这不是真的。

【讨论】:

    【解决方案2】:

    目前,您可以将标题设置为 true,然后显示您的数据 row.to_hash。示例:

    CSV.foreach("/home/akbar/text.csv", headers: true) do |row|
      puts row.to_hash
    end
    

    结果是:

    1.9.3p194 :034 > CSV.foreach("/home/akbar/text.csv", headers: true) do |x|
    1.9.3p194 :035 >     puts x.to_hash
    1.9.3p194 :036?>   end
    {"a"=>"1", "b"=>"some\ntext with line break", "c"=>"21"}
    {"a"=>"2", "b"=>"blah", "c"=>"4"}
    

    有关详细信息,请参阅“ruby-on-rails-import-data-from-a-csv-file”。

    【讨论】:

    • 您需要提供支持证明,这将解决 OP 提出的问题。与其抛出一段代码,不如解释一下为什么它是正确的答案。
    • @theTinMan,感谢您的建议。我必须做得更清楚才能回答。
    • 谢谢。这有帮助。虽然我们只能用代码回答,但这是不鼓励的。没有解释的代码解决了最初的问题,但没有教导,以便将来可以避免这种情况。这类似于给用户一条鱼而不是教他们如何钓鱼。此外,进行更改时无需添加“更新”或“更新”。我们可以通过查看修订历史来了解何时以及发生了什么变化。
    【解决方案3】:

    如果在尝试读取 CSV 文件时遇到麻烦,请使用row_sep: '\r\n' 读取它

    data = CSV.read('your_file.csv', row_sep: "\r\n")
    

    【讨论】:

    • 非常感谢。它完全解决了我的问题。在我的 csv 文件中,标题或字段值可能包含像"abc\ndef " 这样的换行符,但每行的所有换行符都是“\r\n”。 row_sep: "\r\n"完美解决问题
    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2021-10-24
    • 2017-07-10
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多