PHP读取csv,双引号问题
我有一个csv文件,有6行,如下所示:PHP读取csv,双引号问题,php,csv,fgetcsv,Php,Csv,Fgetcsv,我有一个csv文件,有6行,如下所示: 10264,dan,Dan,37519,MILLER,6/3/2014 14:51,$28.40,Rapid,Dan@Cold.com,, 10443,Dari,"D. R, LLC",37308,SELLERS,6/2/2014 15:12,$40.00,esponse,chards@lobal.net,, 10488,EmHern,"A HOME FOR YOU,LLC",37749,MILLER,6/1/2014 8:23,$33.00, Respo
10264,dan,Dan,37519,MILLER,6/3/2014 14:51,$28.40,Rapid,Dan@Cold.com,,
10443,Dari,"D. R, LLC",37308,SELLERS,6/2/2014 15:12,$40.00,esponse,chards@lobal.net,,
10488,EmHern,"A HOME FOR YOU,LLC",37749,MILLER,6/1/2014 8:23,$33.00, Response,23@YAHOO.COM,,
我试图读取该csv并提取一些列,然后为提取的每个列添加一个管道分隔符,下面是我使用的函数:
<?php
function fncReadCSV($csvFileName){
$result = array();
$row = 1;
if (($handle = fopen($csvFileName, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$outPut = "";
$outPut .= $data[0];
$outPut .="|";
$outPut .= $data[1];
$outPut .="|";
$outPut .= $data[2];
$outPut .="|";
$outPut .= $data[6];
$outPut .="|";
$outPut .= $data[8];
$outPut .="|";
array_push($result, rtrim($outPut, "|"));
$row++;
}
}
fclose($handle);
return $result;
}
echo "<pre>";
print_r(fncReadCSV("file.csv"));
echo "</pre>";
我期待的结果是:
echo '<pre>';
if (($handle = fopen($csvFileName, "r")) !== FALSE) {
while (false !== ($data = fgetcsv($handle, 1024))) {
print_r($data);
$data_row = array(
$data[0],
$data[1],
$data[2],
$data[6],
$data[8]
);
$result[] = implode("|", $data_row);
$row++;
}
}
fclose($handle);
return $result;
fgetcsv()应该处理单引号,很好,事实上fputcsv()的默认输出是对其中包含空格的任何行进行引号(换行)。在字符串周围使用带分隔符的“”完全可以预期为“words,otherwords”,这对于fgetscsv来说是100%好的
试试这个
$outPut .="|";
array_push($result, rtrim($outPut, "|"));
array_push($result, $outPut));
事实上,运行您的精确代码会给我这个输出
echo "<pre>";
$result = array();
$row = 1;
if (($handle = fopen(__DIR__.'/test.csv', "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if(count($data) == 1){
$f = fopen('php://temp', 'w');
fwrite($f, $data[0]);
rewind($f);
$data = fgetcsv($f, 1000, ",");
fclose($f);
}
$data_row = array(
$data[0],
$data[1],
$data[2],
$data[6],
$data[8]
);
$result[] = implode("|", $data_row);
$row++;
}
}
var_export($result);
fclose($handle);
运行我的代码会让我
array(
'0' => '10264|dan|Dan|$28.40|Dan@Cold.com',
'1' => '10443|Dari|D. R, LLC|$40.00|chards@lobal.net',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|23@YAHOO.COM'
)
这是你的解决办法
解释
getcsv由于外部引号而返回单个元素”,但它会在“D.R,LLC”位周围去掉一组引号(witch给我们一个类似于第1行的字符串),然后检查该单个元素,并将其写入临时缓冲区(流包装器)然后用fgetcsv和voila fixed重新处理流!对不起,我不明白,这可以修复吗?如果不计算列,您的csv看起来很好,即“D.R,LLC”“很好。对不起,我有两个rr在print_r中,print_r将打印每行上的数据,以便您可以验证csv是否正确读取,pre标记保留空白并使读取print_r输出更容易。很抱歉,您的代码没有修复它,我知道我的csv很好,但我想知道如何在PHP中使用什么来处理它?”?具体地说,我一直在使用fgetcsv加引号,您的输出毫无意义,即使是挂起的“单双引号”,您也无法获得该输出。
$result = array();
$row = 1;
if (($handle = fopen(__DIR__.'/test.csv', "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$outPut = "";
$outPut .= $data[0];
$outPut .="|";
$outPut .= $data[1];
$outPut .="|";
$outPut .= $data[2];
$outPut .="|";
$outPut .= $data[6];
$outPut .="|";
$outPut .= $data[8];
$outPut .="|";
array_push($result, rtrim($outPut, "|"));
$row++;
}
}
fclose($handle);
array(
'0' => '10264|dan|Dan|$28.40|Dan@Cold.com',
'1' => '10443|Dari|D. R, LLC|$40.00|chards@lobal.net',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|23@YAHOO.COM'
)
array(
'0' => '10264|dan|Dan|$28.40|Dan@Cold.com',
'1' => '10443|Dari|D. R, LLC|$40.00|chards@lobal.net',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|23@YAHOO.COM'
)
echo "<pre>";
$result = array();
$row = 1;
if (($handle = fopen(__DIR__.'/test.csv', "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if(count($data) == 1){
$f = fopen('php://temp', 'w');
fwrite($f, $data[0]);
rewind($f);
$data = fgetcsv($f, 1000, ",");
fclose($f);
}
$data_row = array(
$data[0],
$data[1],
$data[2],
$data[6],
$data[8]
);
$result[] = implode("|", $data_row);
$row++;
}
}
var_export($result);
fclose($handle);
array(
'0' => '10264|dan|Dan|$28.40|Dan@Cold.com',
'1' => '10443|Dari|D. R, LLC|$40.00|chards@lobal.net',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|23@YAHOO.COM'
)