PHP读取csv,双引号问题

时间:2014-07-06 00:49:12

标签: 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, 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>";

我得到的结果只对第一行是正确的,对于第2行,第3行我得到完整行,因为它在csv中,我希望引号打破我的代码我该如何解决这个问题一个代码适用于带引号的csv文件和没有请的csv文件?

结果是:

Array
(
    [0] => 10264|dan|Dan|$28.40|Dan@Cold.com
    [1] => 10443,Dari,"D. R, LLC",37308,SELLERS,6/2/2014 15:12,$40.00,esponse,chards@lobal.net,,
    [2] => 10488,EmHern,"A HOME FOR YOU,LLC",37749,MILLER,6/1/2014 8:23,$33.00, Response,23@YAHOO.COM,,
)

我期待的结果是:

Array
    (
        [0] => 10264|dan|Dan|$28.40|Dan@Cold.com
        [1] => 10443|Dari|"D. R, LLC"|esponse|chards@lobal.net
        [2] => 10488|EmHern|"A HOME FOR YOU,LLC"|37749|23@YAHOO.COM
    )

1 个答案:

答案 0 :(得分:1)

fgetcsv()应该处理单引号,实际上fputcsv()的默认输出是引用(换行)任何带有空格的行。完全可以预期带有分隔符的字符串周围,“单词,其他单词”,这与fgetscsv完全相同。

试试这个

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;

implode有点清洁,你不需要修剪额外的“|” ?,因为我认为没有任何目的,为什么不省略最后(最右边)|。

   $outPut .="|";                                  
   array_push($result, rtrim($outPut, "|"));


   array_push($result, $outPut));

实际上运行你的确切代码会给我这个输出吗?

$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'
)

explination

getcsv返回单个元素,因为外部引号“,但它在”D“周围删除了一组引号。 R,LLC“bit(女巫给我们一个类似于第1行的字符串),然后检查该单个元素,并将其写入临时缓冲区(流包装器)并使用fgetcsv重新处理流并保持固定!