使用PHP将CSV转换为JSON?

问题描述:

我需要在使用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; 

那么有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

一些技巧...

  • 如果您有fopen()和包装启用网址开通,您可以使用fgetscsv()
  • 您可以构建一个CSV数组,然后使用PHP的原生json_encode()进行转换。
  • JSON的正确MIME类型是application/json
+0

谢谢,现在我使用json_encode()和纠正的MIME类型。 – VerizonW 2011-01-27 05:42:03

您可以通过删除所有空格和\ n来减少开销。但是,这是在你的笔记。

您可以通过跳过preg_replace并传递一个可打开和关闭的布尔值来提高性能。

除此之外,var [1-10]的变量展开实际上是好的,只要总是有10个变量。

爆炸和foreach方法都很好。

+0

最后我现在用的是更清洁的解决方案删除的空间,谢谢。 – VerizonW 2011-01-27 05:43:15

我推荐使用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(); 

我修改了问题中的答案,将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); 
} 

这些答案都不对与多细胞的工作,因为他们都假设一排“\ 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 
}