【问题标题】:How can I parse a CSV into array with first value as key?如何将 CSV 解析为以第一个值为键的数组?
【发布时间】:2010-08-05 14:13:33
【问题描述】:

所以我有一个如下所示的 CSV 文件:

12345, Here is some text
20394, Here is some more text

我怎样才能将它插入一个看起来像这样的数组中

$text = "12345" => "Here is some text",
        "20394" => "Here is some more text";

这是我目前必须在一层 CSV 上获得基于单个数值的值

      if ($handle = fopen("$qid", "r")) {

          $csvData = file_get_contents($qid);
          $csvDelim = "\r";

          $qid = array();
          $qid = str_getcsv($csvData, $csvDelim);

      } else {

          die("Could not open CSV file.");

      }

感谢您的回复,但我仍然看到一个潜在的问题。使用这些解决方案,值不会以这种方式存储:

$array[0] = 12345
$array[1] = Here is some text 20394
$array[2] = Here is some more text

如果我在上面的示例 csv 上尝试此操作,数组将如何构造?

【问题讨论】:

  • 文本中是否出现逗号?
  • 你的分隔符应该是',',而不是"\r"
  • 你问什么......这不可能,计算机没有这种黑魔法的能力。您需要用汇编程序编写数千行代码,并且您的计算机中至少有 16 个内核才能尝试它。

标签: php arrays csv key


【解决方案1】:

您可以使用fgetcsv() 将文件中的一行读入数组。所以是这样的:

$a = array();
$f = fopen(....);
while ($line = fgetcsv($f))
{
    $key = array_shift($line);
    $a[$key] = $line;
}
fclose($f);
var_dump($a);

【讨论】:

  • fgetcsv替换fopen
  • @Sarfaz: 呃,fgetcsv 仍然需要来自fopen 的句柄?还是曾经有需要更换的fread
【解决方案2】:

假设 CSV 文件中的第一行包含列标题,这将使用这些标题为每一行的数据创建一个关联数组:

$filepath = "./test.csv";
$file = fopen($filepath, "r") or die("Error opening file");
$i = 0;

while(($line = fgetcsv($file)) !== FALSE) {
    if($i == 0) {
        $c = 0;
        foreach($line as $col) {
            $cols[$c] = $col;
            $c++;
        }
    } else if($i > 0) {
        $c = 0;
        foreach($line as $col) {
            $data[$i][$cols[$c]] = $col;
            $c++;
        }
    }
    $i++;
}

print_r($data);

【讨论】:

    【解决方案3】:

    如果你正在阅读一个文件,我可以推荐使用类似 fgetcsv() 这会将 CSV 中的每一行读入一个包含所有列作为值的数组。

    http://at2.php.net/fgetcsv

    【讨论】:

      【解决方案4】:
      $csv_lines = explode('\n',$csv_text);
      foreach($csv_lines as $line) {
        $csv_array[] = explode(',',$line,1);
      }
      

      编辑 - 基于原始问题后发布的代码:

        if ($handle = fopen("$qid", "r")) {
      
            $csvData = file_get_contents($qid);
            $csvDelim = "\r"; // assume this is the line delim?
      
            $csv_lines = explode($csvDelim,$csvData);
            foreach($csv_lines as $line) {
              $qid[] = explode(',',$line,1);
            }
      
        } else {
      
            die("Could not open CSV file.");
      
        }
      

      【讨论】:

      • 致命错误:第 39 行 C:\xampp\htdocs\hint_updater\index.php 中的字符串不支持 [] 运算符
      • 哎呀,哈哈,好吧,$qid 用于字符串和数组,我没有注意到。尝试在“foreach”循环之前将 $qid 重新声明为数组,就像您在代码中所做的那样 $csv_lines = explode($csvDelim,$csvData); $qid = 数组(); foreach($csv_lines as $line) { $qid[] = explode(',',$line,1);也可以用 $qid_array 代替,这样你就不会丢失原始文件字符串。
      【解决方案5】:

      对于包含两列的新文件,$qid 应该成为一个数组,每行包含两个值。

      $csvDelim = ",";
      $qid = str_getcsv($csvData, $csvDelim);
      $text[$qid[0]] = $qid[1];
      

      【讨论】:

        猜你喜欢
        • 2019-12-09
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 2015-05-21
        • 2019-02-22
        • 2017-04-30
        • 1970-01-01
        • 2018-05-16
        相关资源
        最近更新 更多