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);
我有一个包含 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);