破碎的CSV,我该如何解决?

时间:2011-06-13 20:17:08

标签: php javascript mysql parsing csv

我正在尝试解析CSV。我想把它放到一个数据库中,或者只是用JavaScript解析它,但是由于语法错误,这两种方式都失败了。我的整个CSV文件都在这里:
https://gist.github.com/1023560

如果你注意到,它会在双引号中有双引号的地方中断,并且在插入MySQL时也会失败。第一次突破见第13行。它中断而不是返回完整的:

 <a href="http://www.facebook.com/pages/Portland-Community-Gardens/139244076118027?v=wall" target="_blank"><img src="/shared/cfm/image.cfm?id=348340" alt="Facebook" width="100" height="31" /></a>

它返回:

<a href="

对于JavaScript,我将使用Ben Nadel的CSVToArray():
http://www.bennadel.com/blog/1504-Ask-Ben-Parsing-CSV-Strings-With-Javascript-Exec-Regular-Expression-Command.htm

我的最终目标是放入MySQL,这样我就能用PHP的json_encode()回显一个JSON提要。

我注意到可能有问题的是,双引号可以在上面的HTML标记中,也可以作为HTML标记的textNodes,所以"<span class="text">"Example"</span>"

第一组引号是CSV列,第二组是HTML引号,第三组是文本引号。

3 个答案:

答案 0 :(得分:2)

可以能够欺骗它并使用正则表达式来寻找:

"(.*?)"(?=,|$)

但这就是hack-ish(基本上,只有在紧跟逗号或结尾后才接受结尾引用)。相同的逻辑适用于find-replace。 (同样,这一切都假定“迷路”引用永远不会遵循标准的CSV规则(例如,在它之前或之后有一个逗号/行[开头/结尾]))

我认为您无法控制原始数据并且必须使用您拥有的数据?

修改

虽然我只是在您的数据的示例上尝试了此操作,但这似乎找到了“迷路”引号,您可以使用""替换为{

(?<!^|"|,)"(?!"|,|$)

答案 1 :(得分:0)

引号与逗号无关。如果逗号是分隔符,则您不能在值中使用逗号。如果您可以使用不同的分隔符保存CSV,则可能会获得更好的结果 使用像〜或a ^这样的字符而不是逗号作为分隔符。

答案 2 :(得分:0)

假设您在Windows上或在Windows机器上执行此操作,请查看Logparser。它是一个免费的命令行实用程序,可以解析包括CSV在内的多种数据格式,并可以输出多种格式,包括SQL。