簡體   English   中英

PHP閱讀csv,雙引號問題

[英]PHP reading csv, issue with double quotes

我有一個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>";

我得到的結果僅對第一行是正確的,對於第二,第三行,我得到的是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
    )

fgetcsv()應該處理單引號,事實上fputcsv()的默認輸出是引用(換行)其中帶有空格的任何行。 完全希望用定界符在字符串周圍包含“”,即“單詞,其他單詞”,這對於fgetscsv可以100%罰款。

嘗試這個

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;

內爆比較干凈,您將不需要修剪多余的“ |” ?,因為無論如何我都沒有看到目的,為什么不省略最后一個(最右邊)|。

   $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”位(女巫給我們提供了類似於第1行的字符串),然后檢查該單個元素,並將其寫入臨時緩沖區((流包裝器)),並使用固定的fgetcsv和voila重新處理該流!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM