PHP - fgetcsv 循环逐列从 csv 文件中获取数据

PHP - fgetcsv loop for get data from csv file column by column

我有一个包含 31 列和 24 行的 CSV 文件。我需要 fgetcsv (或者可能是另一种解决方案)来传递 CSV 并逐列获取数据。我有一个解决方案:

 // { ?
  for ($col=1; $col<=32; $col++) {
    while ($data = fgetcsv($read, max, ";")) {          
      $row[] = $data[$col];
    }
    print_r($row);
    //... in the line behind i have sql query to insert data in base.   
  }  
  unset($row);  
}

for 循环正在运行,但 $data[$col] 仅从 CSV 的第一列获取数据,当 $col 为 [=17= 时,它不会从 $data[$col] 获取数据], 3, 4, ..., 31.

我哪里出错了,有什么问题吗?代码对我来说看起来没问题,但我认为我对 fgetcsv 函数一无所知。

max 是 CSV 的文件大小,fgetcsv 看到的是文件的最大大小。无论 fgetcsv 中的内容是什么,他们只会看到第一列,不会在每次 $col 更改时循环。

insert = "INSERT INTO xxxx (v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24) VALUES ('$row[1]','$row[2]','$row[3]','$row[4]','$row[5]','$row[6]','$row[7]','$row[8]' '$row[9]','$row[10]','$row[11]','$row[12]','$row[13]','$row[14]','$row[15]','$row[16]','$row[17]','$row[18]','$row[19]','$row[20]','$row[21]','$row[22]','$row[23]','$row[24]')"

在您的代码中:

for ($col=1; $col<=32; $col++) {
  while ($data = fgetcsv($read, max, ";")) {

您尝试从文件中提取 所有 行 32 次。第一次迭代从文件中获取所有行,因为 while 循环在 fgetcsv returns false 时结束(当没有更多数据可读时)。

I need with fgetcsv(or maybe other solution) to pass in csv and get data column by column.

您不能逐列读取数据,因为文件是逐行读取的,每行代表 table 行。如果要按列迭代 table 数据,可以将整个 table 读入数组,然后交换行和单元格:

$table = [];
while ($row = fgetcsv($fp)) {
  $table []= $row;
}

for ($r = 0; $r < count($table); $r++) {
  for ($c = 0; $c < count($table[$r]); $c++) {
    $new_table[$c][$r] = $table[$r][$c];
  }
}

// Use $new_table to iterate the table "by columns"
foreach ($new_table as $column) {
  foreach ($column as $cell) {
    $fields []= $cell;
  }
  $fields = implode(',', $cell);
  // do_something($fields)
}

因此您不需要外部循环迭代列 "indices",因为 fgetcsv 已经为下一行获取了一个数组,其中的项目包含单元格值:

$row = fgetcsv($fp);
// $row = ['column 0 cell', 'column 1 cell', ... ]

至少,将循环 放入 获取行的 while 循环中。如果要迭代单元格,请迭代 fgetcsv.

返回的值

例子

$fp = fopen('test.csv', 'w+');

for ($i = 0; $i < 4; $i++) {
  for ($j = 0; $j < 6; $j++) {
    $a[$i][$j] = "r $i c $j";
  }
  fputcsv($fp, $a[$i]);
}

rewind($fp);
while ($row = fgetcsv($fp)) {
  echo implode(' | ', $row), PHP_EOL;
  // Or iterate $row, if you need:
  // foreach ($row as $cell) { do_something($cell); }
}

fclose($fp);

输出

r 0 c 0 | r 0 c 1 | r 0 c 2 | r 0 c 3 | r 0 c 4 | r 0 c 5
r 1 c 0 | r 1 c 1 | r 1 c 2 | r 1 c 3 | r 1 c 4 | r 1 c 5
r 2 c 0 | r 2 c 1 | r 2 c 2 | r 2 c 3 | r 2 c 4 | r 2 c 5
r 3 c 0 | r 3 c 1 | r 3 c 2 | r 3 c 3 | r 3 c 4 | r 3 c 5

您可以使用数组推送功能,如下所示:

$csvFile = fopen("somefile.csv", "r");

        $firstline = true;
        $column1_array = array();
        $column2_array = array();

        while (($data = fgetcsv($csvFile, 2000, ",")) !== FALSE) {

            if (!$firstline) {

                if ($data['0'] != null || $data['0'] != "") {
                    array_push($column1_array, $data['0']);
                }
                if ($data['1'] != null || $data['1'] != "") {
                    array_push($column2_array, $data['1']);
                }
            }

            $firstline = false;
        }

        foreach ($column1_array as $value1) {

            foreach ($column2_array as $value2) {
                echo $value1 . $value2;
            }
        }

        // print_r($column1_array);
        // print_r($column2_array);

        fclose($csvFile);