使用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输出举行命名字段然而,你必须适应$阵列。
一些技巧...
- 如果您有
fopen()
和包装启用网址开通,您可以使用fgetscsv()
。 - 您可以构建一个CSV数组,然后使用PHP的原生
json_encode()
进行转换。 - JSON的正确MIME类型是
application/json
。
谢谢,现在我使用json_encode()和纠正的MIME类型。 – VerizonW 2011-01-27 05:42:03
您可以通过删除所有空格和\ n来减少开销。但是,这是在你的笔记。
您可以通过跳过preg_replace并传递一个可打开和关闭的布尔值来提高性能。
除此之外,var [1-10]的变量展开实际上是好的,只要总是有10个变量。
爆炸和foreach方法都很好。
最后我现在用的是更清洁的解决方案删除的空间,谢谢。 – 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
}
非常感谢你,这是一个非常干净的解决方案,我编辑我的帖子与我现在使用的代码基于您的答案,我加了array_combine输出JSON的属性名称。 – VerizonW 2011-01-27 05:41:19