【问题标题】:Importing CSV that has line breaks within the actual fields导入在实际字段中有换行符的 CSV
【发布时间】:2011-07-25 04:01:02
【问题描述】:

我正在使用 PHP 导入一个 CSV 文件,该文件源自一个 excel 电子表格。某些字段中包含换行符,因此当我在 excel/open office 电子表格中重新打开 csv 时,它会误解应该在哪里发生换行符。

同样在我的脚本中,使用 fgetcsv 遍历每一行,它在不应该出现的地方错误地换行。

我可以手动清理数据,但是 a) 10k 行文件需要很长时间,b) 数据是从客户现有的软件中导出的

关于如何在导入过程中自动解决此问题的任何想法?我原以为分隔字段会对其进行排序,但事实并非如此。

【问题讨论】:

  • 只要带换行符的字段被引用"foo\nbar",列对齐不应该受​​到影响
  • LF 在 CSV 字段中应编码为\n。您将需要一个自定义阅读器来撤消该出口损坏。查看php.net/fgetcsv,但您可能需要搜索或写一个。
  • xzyfer,该解决方案不起作用,因为我需要能够从文件指针的特定行开始,因为将整个 15mb csv 加载到生产服务器上的字符串中是行不通的 :(不过还是谢谢

标签: php csv import line-breaks


【解决方案1】:

接受的答案并没有解决我的问题,但我最终在谷歌代码上找到了这个 CSV 解析器库,它适用于 CSV 中的多行字段。

parsecsv-for-php:
https://github.com/parsecsv/parsecsv-for-php


出于历史目的,最初的项目主页是:
http://code.google.com/p/parsecsv-for-php/

【讨论】:

  • +1 这是迄今为止最好的解析器!比 str_getcsv 或类似的更好。我的数据在字段中包含 HTML 和换行符。这是唯一正确的解析器!谢谢!
  • 对于最广泛使用的编程语言之一,很难为最常见的格式之一找到准确的解析器,这有点令人遗憾。我想这部分是因为没有官方标准,但是引用值内的换行符绝对是 CSV 解析器应该能够处理的。
  • 这应该是认可的答案。谢谢
  • 我搜索了数周,这个答案结束了我的搜索。这在 2021 年仍然有效!
【解决方案2】:

这是一个旧线程,但我遇到了这个问题,我用一个正则表达式解决了它,所以你可以避免为此使用一个库。这里的代码是 PHP 的,但它可以适应其他语言。

$parsedCSV = preg_replace('/(,|\n|^)"(?:([^\n"]*)\n([^\n"]*))*"/', '$1"$2 $3"', $parsedCSV);

这个解决方案假设包含换行符的字段用双引号括起来,这似乎是一个有效的假设,至少就我目前所看到的而言。此外,双引号应跟在, 之后或放在新行(或第一行)的开头。

例子:

field1,"field2-part1\nfield2-part2",field3

这里的 \n 被一个空格替换,所以结果是:

field1,"field2-part1 field2-part2",field3

正则表达式也应该处理多个换行符。

如果内容太大,这可能效率不高,但它可以在许多情况下有所帮助,并且可以重复使用这个想法,也许可以通过对较小的块执行此操作来优化(但您需要使用修复来处理剪切-大小缓冲)。

【讨论】:

    【解决方案3】:

    虽然这是一个老问题,但答案可能仍然与 ppl 相关。 目前有新的库(独立于框架)http://csv.thephpleague.com/,它支持字段中的 NL 字符以及一些过滤。

    【讨论】:

      【解决方案4】:

      我的解决方案如下:

      nl2br(string);
      

      http://php.net/manual/en/function.nl2br.php

      一旦你到达单个单元格(字符串)级别,在字符串上运行它,它会为你将换行符转换为 html 换行符。

      【讨论】:

        【解决方案5】:

        是的,您需要找到该逗号并替换为一些特殊字符,例如 {()} 的组合,最后将它们替换为您最初寻找的 ,

        希望对你有所帮助。

        【讨论】:

        • 对不起,这根本没有帮助,请在回答之前阅读完整的问题
        【解决方案6】:

        我也有这个问题,没有找到正确读取数据的方法。

        在我的例子中,它是一次性导入,所以我编写了一个脚本来搜索列中的所有换行符,并将其替换为 ##### 之类的内容。然后我导入数据并用换行符替换它。

        如果您需要定期导入,您可以编写自己的 CSV-Parser,它可以解决问题。如果文本列在 "" 内,您可以将两个 "" 之间的所有内容视为一列(检查内容中的转义 ")。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-28
          • 2015-08-18
          • 1970-01-01
          相关资源
          最近更新 更多