PHP:解析.csv文件,在字段值中包含换行符(部分引用)

时间:2016-09-13 11:55:20

标签: php csv parsing delimiter multiline

关于这个话题已有一些问题,但我还没有找到令人满意的答案。虽然常见的.csv阅读器软件(例如Libre Office)可以毫无问题地读取文件但PHP存在问题。

文件的示例部分:

86010800,class,Table Games,,"(10005183, 10005184, 10005185)"
86011100,class,Toy Vehicles – Non-ride,,"(10005192, 10005190, 10005191, 10005193, 10005194, 10005195, 10005196)"
86011000,class,Toys – Ride-on,,"(10005187, 10005188, 10005441, 10005189)"
86010900,class,Toys/Games Variety Packs,,(10005186)
10001686,brick,Airbrushes (Powered),"Definition:
 Includes any products that can be described/observed as a powered 
machine that scatters paint using air pressure and which is used for 
design illustrations, fine art and delicate fine spray applications. The
 machine comprises of a compression or propulsion device to scatter the 
paint.Specifically excludes Spray Paint and Aerosols.Excludes Airbrushing Replacement Parts and Accessories such as Airbrush Control Valves and Airbrush Hoses.",()
10001688,brick,Airbrushing Equipment – Replacement Parts/Accessories,Definition: Includes any products that can be described/observed as a replacement part/accessory for airbrushing equipment.Includes products such as Airbrush Control Valves and Airbrush Hoses.Excludes products such as complete Airbrushes.,(20001349)
10001690,brick,Airbrushing Supplies Other,"Definition:
 Includes any products that may be described/observed as Airbrushing 
Supplies products, where the user of the schema is not able to classify 
the products in existing bricks within the schema.Excludes all currently classified Airbrushing Supplies.",()

如您所见,第4列和第5列部分引用,因为它们可能包含换行符,因此不会引用简单值。

我想要的是一个二维数组,其中一行是1级,而行的5列是2级。

我试过了

  

fgetcsv()

无法解析多行字段和

  

str_getcsv()

无法使用正确的参数在两个维度中进行解析。如何用PHP最好地解析这个.csv文件?

1 个答案:

答案 0 :(得分:2)

希望SplFileObject :: fgetcsv()可以帮助您解析CSV文件。在下面提到的链接中,已经给出了示例,因此请使用它并检查其是否正确获取。 http://php.net/manual/en/splfileobject.fgetcsv.php

编辑:完整代码示例

$file = new SplFileObject('../../temp/file.csv');
$ar = array();
while (!$file->eof()) {
    array_push($ar,$file->fgetcsv());
}
echo '<pre>';
print_r($ar);
echo '</pre>';
die;