导入在实际字段中包含换行符的CSV

时间:2011-03-29 10:19:40

标签: php csv import line-breaks

我使用PHP导入CSV文件,该文件来自excel电子表格。有些字段中包含换行符,因此当我在excel / open office电子表格中重新打开csv时,它会错误地解释换行的位置。

同样在我的脚本中,使用fgetcsv遍历每一行,它不正确的换行位置。

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

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

6 个答案:

答案 0 :(得分:15)

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

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


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

答案 1 :(得分:3)

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

在我的情况下,它是一次性导入,因此我创建了一个脚本,用于搜索列中的所有换行符,并将其替换为#####之类的内容。然后我导入了数据并将其替换为换行符。

如果您需要定期导入,您可以编写自己的CSV-Parser来处理问题。如果文字列位于""范围内,您可以将两个""之间的所有内容视为一列(并检查内容中的转义")。

答案 2 :(得分:1)

我的解决方案如下:

nl2br(string);

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

进入单个单元格(字符串)级别后,在字符串上运行它,它会将换行符转换为html中断。

答案 3 :(得分:0)

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

希望对你有所帮助。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

int getMaxBits(long number) { return number != 0 ? getMaxBits(number & (number >>> 1)) + 1 : 0; }

这个解决方案假设包含换行符的字段用双引号括起来,这似乎是一个有效的假设,至少对于我到目前为止看到的情况。此外,双引号应遵循$parsedCSV = preg_replace('/(,|\n|^)"(?:([^\n"]*)\n([^\n"]*))*"/', '$1"$2 $3"', $parsedCSV);或放在新行(或第一行)的开头。

示例:

,

这里的\ n被空格替换,结果如下:

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

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

如果内容太大,这可能效率不高,但它可以帮助很多情况并且可以重复使用这个想法,可以通过对较小的块进行优化来优化(但是你需要使用修复大小的缓冲区)。