Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby/Rails,使用引号之间的换行符解析CSV_Ruby On Rails_Ruby_Csv - Fatal编程技术网

Ruby on rails Ruby/Rails,使用引号之间的换行符解析CSV

Ruby on rails Ruby/Rails,使用引号之间的换行符解析CSV,ruby-on-rails,ruby,csv,Ruby On Rails,Ruby,Csv,有没有办法告诉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 我希望它只返回两行,但它返回三行。当前,您可以将标题设置为true,然后显示数据行。to_hash。例如: CSV.foreach("/home/akbar/text.cs

有没有办法告诉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

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

当前,您可以将标题设置为true,然后显示数据
行。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"}
有关更多信息,请参见“

您(错误地)根据打印行数判断行数。它返回两个。想象一下:

[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">
]
[4]pry(main)>CSV.foreach('example.CSV',headers:true)。到
=> [
#,
#
]

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

对于那些在尝试读取任何一行出现换行的CSV文件时遇到麻烦的人,只需使用
行sep:'\r\n'

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

如果换行符不是行分隔符,那么什么是?换行符是行分隔符,但当引号之间出现新行时,例如“asd\n asdf”,它不应被视为两行。它返回精确的三行-这是它应该使用的方式。但如果你的评论不真实,可能会返回四个。换句话说,您的所有行都建议为一行。。。不是吗?您可以使用regexp预处理引号内的每个文本部分,并删除任何内部“\n”,不包括标题。它返回三行:[[“1”,“some”],[“带换行符的文本”,“21”],[“2”,“blah”,“3”]。我希望它返回两行:[“1”,“一些带换行符的\n文本”,“21”],[“2”,“blah”,“4”]您需要提供支持证据,证明这将解决OP提出的问题。与其抛出一段代码,不如解释为什么它是正确的答案。@theTinMan,谢谢您的建议。我必须更清楚地回答。谢谢。这很有帮助。虽然我们只能用代码回答,但这是不鼓励的。没有解释的代码可以解决问题最初的问题,但不是为了避免将来出现这种情况而教授。这类似于给用户一条鱼,而不是教他们如何钓鱼。此外,没有必要添加“更新”或“更新”在进行更改时。我们可以通过查看修订历史记录来查看更改的时间和内容。非常感谢。它完全解决了我的问题。在我的csv文件中,标题或字段值可以包含像
“abc\ndef”
,但每行的所有换行符都是“\r\n”。
行sep:“\r\n”
完美地解决了问题