Ruby将数组存储到csv导致输出带有额外的“”

时间:2016-01-02 08:25:47

标签: arrays ruby csv

我有一个脚本正在废弃一个网站,生成一个csv文件,并将原始数据存储到此csv中。一切正常,除非我试图将数组存储到csv文件中:

tarif_jeune = []
tarif_adulte =[]
              html_doc.search("td table table table tr").each do |tr|
                unless (tr.css("td:nth-child(11)").text.squish == "") || (tr.css("td:nth-child(11)").text.squish.size > 5) || (tr.css("td:nth-child(11)").text.squish ==  "0,00")
                  tarif_adulte << tr.css("td:nth-child(11)").text.squish
                end
                unless (tr.css("td:nth-child(12)").text.squish == "") || (tr.css("td:nth-child(12)").text.squish.size > 5) || (tr.css("td:nth-child(12)").text.squish ==  "0,00")
                  tarif_jeune << tr.css("td:nth-child(12)").text.squish
                end
              end

然后将tarif_jeunetarif_adulte插入csv文件:

 csv << ["true", tr.css("td:nth-child(10)").text.squish, tr.css("td:nth-child(11)").text.squish, tr.css("td:nth-child(11)").text.squish, tr.css("td:nth-child(12)").text.squish, tr.css("td:nth-child(13)").text.squish, tr.css("td:nth-child(14)").text.squish, tr.css("td:nth-child(15)").text.squish,  tr.css("td:nth-child(1) a").attr("href").value, tarif_jeune.uniq, tarif_adulte.uniq, cat.uniq, address]

cat,tarif_jeune,tarif_adulte都是数组。我希望它们在我的csv [“poo”,“faa”,“foo”]中看起来像这样,但是输出是完全不同的:“”到处插入,我得到这样的东西:

tarif_jeune, tarif_adulte, cat
"[""15,00""]","[""20,00""]","[""Simple Messieurs 45"", ""Simple Dames Senior"", ""Simple Messieurs Senior""]"

有人可以解释这些额外“来自哪里以及如何摆脱它们。”

2 个答案:

答案 0 :(得分:0)

双引号"字符是CSV类中的默认:quote_char

因此,如果您尝试编写包含双引号字符的字符串,它们将被CSV类转义,并将""写入该文件。

在您的情况下,您正在将字符串数组写入CSV。在字符串数组上调用Array#to_s时,输出将是一个类似于下面的字符串:

ary = ["a", "b", "c"]
puts "#{ary}"
#=> ["a", "b", "c"]

数组的字符串表示形式中的双引号将由CSV类转义,上述ary将在csv文件中显示为"[""a"", ""b"", ""c""]"

要解决此问题,请查看为什么需要将输出Array#to_s存储在CSV中。您最有可能想要ary.join(" ")或等效,然后写入文件。

答案 1 :(得分:0)

这是完全有效的csv。

假设您希望数据看起来像这样(正如您在["poo", "faa", "foo"]中所说的那样):

tarif_jeune, tarif_adulte, cat
["15,00"],["20,00"],["Simple Messieurs 45", "Simple Dames Senior", "Simple Messieurs Senior"]

这里,在字段中,有一个逗号,也是你的字段分隔符。因此,字段必须用引号括起来。并且因为您的字段中也包含引号,所以这些引号需要使用另一个引号进行转义:

tarif_jeune, tarif_adulte, cat
"[""15,00""]","[""20,00""]","[""Simple Messieurs 45"", ""Simple Dames Senior"", ""Simple Messieurs Senior""]"

任何体面的csv解析器都应该能够处理这些额外的引号。事实上,如果没有它们,你的csv就会出错。