簡體   English   中英

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的第一列中獲取數據,它不會從獲得的數據$data[$col]$col234 ,..., 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]')"
  1. 確保max是一個值,可能$應該存在
  2. 反轉循環順序,以便一次調用fgetcsv

這是如何完成這些事情的一個示例:

$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.   
  }
}

在您的代碼中:

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

因此,您不需要外部循環來迭代“索引”列,因為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM