我使用PHP导入CSV文件,该文件来自excel电子表格。有些字段中包含换行符,因此当我在excel / open office电子表格中重新打开csv时,它会错误地解释换行的位置。
同样在我的脚本中,使用fgetcsv遍历每一行,它不正确的换行位置。
我可以手动清理数据,但a)需要很长时间作为10k行文件,b)数据从客户现有的软件导出
有关如何在导入过程中自动解决此问题的任何想法?我原本以为分隔字段会对它进行排序,但事实并非如此。
答案 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
正则表达式也应该处理多个换行符。
如果内容太大,这可能效率不高,但它可以帮助很多情况并且可以重复使用这个想法,可以通过对较小的块进行优化来优化(但是你需要使用修复大小的缓冲区)。