【问题标题】:Exploding comma deliminated CSV file when column values itself contains comma当列值本身包含逗号时,会爆炸以逗号分隔的 CSV 文件
【发布时间】:2014-01-16 11:03:50
【问题描述】:

我正在逐行读取逗号分隔的 CSV 文件,然后使用 PHP explode 函数分隔每个列值。问题是有些列本身包含 逗号 (,) 值,因此它们也被分解了。

一行数据:

03,1392,06,1000,1,"1000,36,21,68",4,AF,TJ,AF,44071000

这里 "1000,36,21,68" 必须被视为单个值,但 PHP 爆炸也会破坏它。我知道这是explode的工作原理,但是在这种情况下是否可以使用任何替代功能。我还需要从这个值的两边删除 双引号 (")

【问题讨论】:

  • php.net/fgetcsv,如果您正在从文件中读取。
  • @hal9000 preg_split 似乎是个好主意,在这种情况下应该是什么正则表达式?

标签: php csv explode


【解决方案1】:

不要尝试自己使用explode和解析:

使用PHP内置的str_getcsv()函数

或使用fgetcsv() 直接从文件中读取和解析每一行

编辑

如果您真的很喜欢冒险,可以使用 SPL 来读取和解析文件

$file = new SplFileObject("data.csv");
while (!$file->eof()) {
    var_dump($file->fgetcsv());
}

$file = new SplFileObject("data.csv");
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $fields) {
    var_dump($fields);
}

【讨论】:

  • 太棒了!我正在使用 fopen 和 fgets 来读取每一行。 fopen 更好还是 SplFileObject 更好?
  • 我倾向于使用 SplFileObject,因为它在设置标志以操纵文件解析方式时提供了更清晰的编码,但 fopen() 和 fgetcsv() 真的很容易编码
猜你喜欢
  • 2017-08-19
  • 2016-12-04
  • 2011-08-02
  • 2020-02-21
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多