2012-05-23 19 views
3

我想將CSV轉換爲Json,使用標題行作爲鍵,並將每行作爲對象。我如何去做這件事?CSV到Json的標題行作爲鍵

---------------------------------- CSV ----------- ----------------------

InvKey,DocNum,CardCode 
11704,1611704,BENV1072 
11703,1611703,BENV1073 

--------------------- ------------ PHP -----------------------------------

if (($handle = fopen('upload/BEN-new.csv'. '', "r")) !== FALSE) { 
     while (($row_array = fgetcsv($handle, 1024, ","))) { 
      while ($val != '') { 
       foreach ($row_array as $key => $val) { 
         $row_array[] = $val; 
         } 
       } 
      $complete[] = $row_array; 
      } 
      fclose($handle); 
     } 
     echo json_encode($complete); 

回答

13

就分別讀取第一行並將其合併到每一行:

if (($handle = fopen('upload/BEN-new.csv', 'r')) === false) { 
    die('Error opening file'); 
} 

$headers = fgetcsv($handle, 1024, ','); 
$complete = array(); 

while ($row = fgetcsv($handle, 1024, ',')) { 
    $complete[] = array_combine($headers, $row); 
} 

fclose($handle); 

echo json_encode($complete); 
+0

你介意解釋一下代碼嗎? – MG1

+3

你不瞭解它嗎?它打開一個文件句柄,*將第一行*讀入'$ headers',然後讀取其餘的行。它將每行與'$ headers'結合在一起。參見[array_combine](http://php.net/array_combine)。 – deceze

1

我發現自己將CS每隔幾個月將v字符串轉換爲數組或對象。

我創建了一個類,因爲我很懶,不喜歡複製/粘貼代碼。

這個類轉換爲CSV字符串自定義類對象:

Convert csv string to arrays or objects in PHP

0

對於那些想事情闡明誰多一點+一定的空間,以進一步解析,無需額外循環任何行/列:

function csv_to_json_byheader($filename){ 
    $json = array(); 
    if (($handle = fopen($filename, "r")) !== FALSE) { 
     $rownum = 0; 
     $header = array(); 
     while (($row = fgetcsv($handle, 1024, ",")) !== FALSE) { 
      if ($rownum === 0) { 
       for($i=0; $i < count($row); $i++){ 
// maybe you want to strip special characters or merge duplicate columns here? 
        $header[$i] = trim($row[$i]); 
       } 
      } else { 
       if (count($row) === count($header)) { 
        $rowJson = array();      
        foreach($header as $i=>$head) { 
       // maybe handle special row/cell parsing here, per column header 
         $rowJson[$head] = $row[$i];      
        } 
        array_push($json, $rowJson); 
       } 
      } 
      $rownum++; 
     } 
     fclose($handle); 
    } 
    return $json; 
}