我有一个CSV解析器,它接受Outlook 2010 Contact Export .CSV文件,并生成一个值数组。
我打破新行符号的每一行,以及逗号上的每一列。它工作正常,直到有人在一个字段(通常是地址)内放置一个新行。这个新行,我假设为“\ n”或“\ r \ n”,它会爆炸它不应该的行,整个文件从那里变得混乱。
就我而言,当Business Street分为两行时会发生这种情况:
123 Apple博士单位A
我的代码:
$file = file_get_contents("outlook.csv");
$rows = explode("\r\n",$file);
foreach($rows as $row)
{
$columns = explode(",",$row);
// Further manipulation here.
}
我试过“\ n”和“\ r \ n”,结果相同。
我想我可以计算第一行(键)中的列数,然后找到一种方法,在解析了这么多列之前不允许换行,但感觉很阴暗。
我可以尝试新行的另一个字符,它不在数据字段本身内吗?
答案 0 :(得分:1)
处理CSV文件中换行符的最常用方法是“引用”包含重要字符(如换行符或逗号)的字段。可能值得研究一下你的CSV生成器是否会这样做。
我建议使用PHP fgetcsv() function,用于此目的。正如您所发现的,在逗号上拆分字符串仅适用于最简单的情况。 如果不起作用,可以使用更复杂的,据称符合RFC4180的解析器here。
答案 1 :(得分:1)
我也推荐fgetcsv()
fgetcsv还会处理字符串中的逗号(引号之间)。
+1以前的答案;)
PS:fgetcsv比打开文件然后爆炸内容有点慢。但是值得的。