2014-07-06 46 views
1

我有了6線,如以下csv文件:PHP讀取CSV,發出帶有雙引號

10264,dan,Dan,37519,MILLER,6/3/2014 14:51,$28.40,Rapid,[email protected],, 
10443,Dari,"D. R, LLC",37308,SELLERS,6/2/2014 15:12,$40.00,esponse,[email protected],, 
10488,EmHern,"A HOME FOR YOU,LLC",37749,MILLER,6/1/2014 8:23,$33.00, Response,[email protected],, 

我試圖讀取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|[email protected] 
    [1] => 10443,Dari,"D. R, LLC",37308,SELLERS,6/2/2014 15:12,$40.00,esponse,[email protected],, 
    [2] => 10488,EmHern,"A HOME FOR YOU,LLC",37749,MILLER,6/1/2014 8:23,$33.00, Response,[email protected],, 
) 

我期待的結果是:

Array 
    (
     [0] => 10264|dan|Dan|$28.40|[email protected] 
     [1] => 10443|Dari|"D. R, LLC"|esponse|[email protected] 
     [2] => 10488|EmHern|"A HOME FOR YOU,LLC"|37749|[email protected] 
    ) 

回答

1

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|[email protected]', 
'1' => '10443|Dari|D. R, LLC|$40.00|[email protected]', 
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|[email protected]' 
) 

運行我的代碼給我

array(
'0' => '10264|dan|Dan|$28.40|[email protected]', 
'1' => '10443|Dari|D. R, LLC|$40.00|[email protected]', 
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|[email protected]' 
) 

這裏是您的解決方案

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|[email protected]', 
'1' => '10443|Dari|D. R, LLC|$40.00|[email protected]', 
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|[email protected]' 
) 

explination

getcsv由於外部引號而返回單個元素「,但它會在」D「周圍刪除一組引號。 R,LLC「位(女巫給我們一個類似於第1行的字符串),然後檢查單個元素,並將其寫入臨時緩衝區(流包裝器),並重新處理fgetcsv和voila固定的流!

+0

對不起我不明白,請問這個問題可以解決嗎? – user3593154

+0

你的csv看起來不錯,但是沒有列出「D」的列。 R,LLC「很好。 – ArtisticPhoenix

+0

對不起,我在print_r中有兩個rr,print_r會在每一行上打印數據,因此您可以驗證csv是否正確讀取,pre標記保留空白並使讀取print_r輸出更容易。 – ArtisticPhoenix

相關問題