2011-01-27 103 views
10

我需要在使用PHP的服務器上將CSV文件轉換爲JSON。我使用這個腳本,它的工作原理:使用PHP將CSV轉換爲JSON?

function csvToJSON($csv) { 
    $rows = explode("\n", $csv); 

    $i = 0; 
    $len = count($rows); 
    $json = "{\n" . ' "data" : ['; 
    foreach ($rows as $row) { 
     $cols = explode(',', $row); 
     $json .= "\n  {\n"; 
     $json .= '   "var0" : "' . $cols[0] . "\",\n"; 
     $json .= '   "var1" : "' . $cols[1] . "\",\n"; 
     $json .= '   "var2" : "' . $cols[2] . "\",\n"; 
     $json .= '   "var3" : "' . $cols[3] . "\",\n"; 
     $json .= '   "var4" : "' . $cols[4] . "\",\n"; 
     $json .= '   "var5" : "' . $cols[5] . "\",\n"; 
     $json .= '   "var6" : "' . $cols[6] . "\",\n"; 
     $json .= '   "var7" : "' . $cols[7] . "\",\n"; 
     $json .= '   "var8" : "' . $cols[8] . "\",\n"; 
     $json .= '   "var9" : "' . $cols[9] . "\",\n"; 
     $json .= '   "var10" : "' . $cols[10] . '"'; 
     $json .= "\n  }"; 

     if ($i !== $len - 1) { 
      $json .= ','; 
     } 

     $i++; 
    } 
    $json .= "\n ]\n}"; 

    return $json; 
} 

$json = csvToJSON($csv); 
$json = preg_replace('/[ \n]/', '', $json); 

header('Content-Type: text/plain'); 
header('Cache-Control: no-cache'); 
echo $json; 

$csv變量是從它返回CSV內容的捲曲請求所產生的字符串。

我相信這不是最有效的PHP代碼,因爲我是初學者開發人員,而且我的PHP知識水平低。 有沒有更好,更有效的方法來使用PHP將CSV轉換爲JSON?

在此先感謝。

注意。我知道我添加空白,然後刪除它,我這樣做,所以我可以選擇返回「可讀」JSON通過刪除行$json = preg_replace('/[ \n]/', '', $json);用於測試目的。

編輯。感謝您的回覆,基於這些新的代碼是這樣的:

function csvToJson($csv) { 
    $rows = explode("\n", trim($csv)); 
    $csvarr = array_map(function ($row) { 
     $keys = array('var0','var1','var2','var3','var4','var5','var6','var7','var8','var9','var10'); 
     return array_combine($keys, str_getcsv($row)); 
    }, $rows); 
    $json = json_encode($csvarr); 

    return $json; 
} 

$json = csvToJson($csv); 

header('Content-Type: application/json'); 
header('Cache-Control: no-cache'); 
echo $json; 

回答

23

那麼有json_encode()函數,你應該使用它,而不是自己建立JSON輸出。而且還有一個功能str_getcsv()用於解析CSV:

$array = array_map("str_getcsv", explode("\n", $csv)); 
print json_encode($array); 

如果你想JSON輸出舉行命名字段然而,你必須適應$陣列。

+1

非常感謝你,這是一個非常乾淨的解決方案,我編輯我的帖子與我現在使用的代碼基於您的答案,我加了array_combine輸出JSON的屬性名稱。 – VerizonW 2011-01-27 05:41:19

1

一些技巧...

  • 如果您有fopen()和包裝啓用網址開通,您可以使用fgetscsv()
  • 您可以構建一個CSV數組,然後使用PHP的原生json_encode()進行轉換。
  • JSON的正確MIME類型是application/json
+0

謝謝,現在我使用json_encode()和糾正的MIME類型。 – VerizonW 2011-01-27 05:42:03

0

您可以通過刪除所有空格和\ n來減少開銷。但是,這是在你的筆記。

您可以通過跳過preg_replace並傳遞一個可打開和關閉的布爾值來提高性能。

除此之外,var [1-10]的變量展開實際上是好的,只要總是有10個變量。

爆炸和foreach方法都很好。

+0

最後我現在用的是更清潔的解決方案刪除的空間,謝謝。 – VerizonW 2011-01-27 05:43:15

0

我推薦使用Coseva(csv解析庫)並使用內置的toJSON()方法。

<?php 

// load 
require('../src/CSV.php'); 

// read 
$csv = new Coseva\CSV('path/to/my_csv.csv'); 

// parse 
$csv->parse(); 

// disco 
echo $csv->toJSON(); 
6

我修改了問題中的答案,將CSV的第一行用於數組鍵。這樣做的好處是無需對函數中的鍵進行硬編碼,從而使其可用於任何帶有列標題和任意數量列的CSV。

這是我修改的版本:

function csvToJson($csv) { 
    $rows = explode("\n", trim($csv)); 
    $data = array_slice($rows, 1); 
    $keys = array_fill(0, count($data), $rows[0]); 
    $json = array_map(function ($row, $key) { 
     return array_combine(str_getcsv($key), str_getcsv($row)); 
    }, $data, $keys); 

    return json_encode($json); 
} 
0

這些答案都不對與多細胞的工作,因爲他們都假設一排「\ n」結束。內建函數fgetcsv函數理解多行單元格被包含在「所以它不會遇到同樣的問題。下面的代碼,而不是依靠'\ n'來查找csv的每一行讓fgetcsv排成一行,並準備我們的輸出。

function csv_to_json($file){ 

    $columns = fgetcsv($file); // first lets get the keys. 
    $output = array(); // we will build out an array of arrays here. 

    while(!feof($file)){ // until we get to the end of file, we'll pull in a new line 
     $line = fgetcsv($file); // gets the next line 
     $lineObject = array(); // we build out each line with our $columns keys 
     foreach($columns as $key => $value){ 
      $lineObject[$value] = $line[$key]; 
     } 
     array_push($output, $lineObject); 
    } 
    return json_encode($output); // encode it as json before sending it back 
}