[英]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]
當$col
是2
, 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]')"
max
是一個值,可能$
應該存在 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.