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

时间:2016-12-13 12:49:19

标签: php csv fgetcsv

我有一个包含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的第一列获取数据,当$data[$col]$col时,它不会从2获取数据, 34,...,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]')"

2 个答案:

答案 0 :(得分:0)

  1. 请确保max是一个值,$可能就在那里
  2. 颠倒循环的顺序,以便fgetcsv调用一次
  3. 这是一个如何完成这些事情的例子:

    $your_file = "your_csv_file.csv";
    $max = filesize($your_file);
    
    if (($read = fopen($your_file, "r")) !== FALSE) {
    
      while ($data = fgetcsv($read, $max, ";")) {
        for ($col=1; $col<=32; $col++) {         
          $row[] = $data[$col];
        }
        print_r($row);
        //... sql query to insert data in base.   
      }
    }
    

答案 1 :(得分:0)

在您的代码中:

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

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

  

我需要fgetcsv(或者其他解决方案)来传递csv并逐列获取数据。

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

$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