CSV转Json,使用标题行作为键

3
我希望您将CSV转换为Json,使用标题行作为键,每行作为一个对象。您应该如何操作?

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

我想把一个CSV文件转换成JSON格式,利用表头作为键,每一行作为一个对象。请问应该如何操作?
 InvKey,DocNum,CardCode
 11704,1611704,BENV1072
 11703,1611703,BENV1073

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

PHP是一种流行的开源服务器端脚本语言,它可以嵌入到HTML中。PHP被广泛用于Web开发,特别是动态网站的开发。它可以与许多数据库配合使用,并且可以在不同的操作系统上运行。PHP提供了许多功能和扩展,使得开发人员可以轻松地构建复杂的Web应用程序。

  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);
4个回答

19

只需将第一行独立读取并合并到每行中:

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);

4
你不理解的是什么?它打开一个文件句柄,读取第一行,将其存储在$headers中,然后读取剩下的行。 它将每行与$headers结合。参见array_combine - deceze

1
我发现自己每隔几个月就需要将csv字符串转换为数组或对象。
我创建了一个类,因为我很懒,不喜欢复制/粘贴代码。
这个类可以将csv字符串转换为自定义的类对象: 将CSV字符串转换为PHP中的数组或对象

1
$feed="https://gist.githubusercontent.com/devfaysal/9143ca22afcbf252d521f5bf2bdc6194/raw/ec46f6c2017325345e7df2483d8829231049bce8/data.csv";
//Read the csv and return as array
$data = array_map('str_getcsv', file($feed));
//Get the first raw as the key
$keys = array_shift($data);  
//Add label to each value
$newArray = array_map(function($values) use ($keys){
    return array_combine($keys, $values);
}, $data);
// Print it out as JSON
header('Content-Type: application/json');
echo json_encode($newArray);

主要内容: https://gist.github.com/devfaysal/9143ca22afcbf252d521f5bf2bdc6194

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接