我有一个包含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]')"
答案 0 :(得分:0)
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.
}
}
答案 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