我有一个像这样的 csv 文件
col1, col2, col3
1 , John, ABC
我需要将第 3 列中的 ABC
解析为 A,B,C
因为新关系需要 col1, col3(每个字母)
.
$j
是行,$i
是列。
$j = 0;
while (($row = fgetcsv($handle, 1000, ',')) !== false) {
$i = 0;
$id = 0;
foreach ($row as $field) {
# save the id of each row
if($j >0 && $i == 0){
$id = $field;
}
# parse the third column for non-header rows)
if($j > 0 && $i >= 3){
$char_array = str_split($field);
foreach($char_array as $value){
//echo $value;
//echo $id.$value."<br/>";
mysql_query("INSERT INTO sample VALUES('".$id."', '".$value."')");
}
}
$i = $i + 1; # increment the column
}
$j = $j +1; # move to the next row
}
这很慢。我有720多行,其中大部分在第三列有超过5个字符。
ABCDE
,所以我们平均有 720 x 5。这是一个很大的数字。 我收到超时
。我可以更改本地执行的最长时间,但我需要在我的学生 Linux 帐户上运行它。我没有那种特权。我怀疑是因为超时(这次没说),我上了
id = 502
。我遗漏了其余部分(我最多有 720 行)。
我能做什么?我只对第一列和第三列感兴趣。
最佳答案
IO磁盘读写也很慢。但它不会超时并且使用缓存你实际上不会执行那么糟糕。事实上,我一直这样做,在 PHP 中使用大于 20MB 的数据。还不错....如果我真的想做大数据,我会使用 Python、C++ 算法,因为反正我已经准备好了。
示例,基于您的代码(可能包含错误):
$big = array();
$j = 0;
$k = 0;
while(....) {
....
foreach($char_array as $value){
#mysql_query("INSERT INTO sample VALUES('".$id."', '".$value."')");
$big[$k][0] = $id;
$big[$k][1] = $value;
$k = $k+1;
}
....
}
这里你创建了一个嵌套数组。 $big
是外部数组,在内部分配列和行。
使用fputcsv
写入一个新的csv。根据您的规范,新的 csv 应如下所示:
1, A
1, B
这是写入 csv 的代码(来自 php 文档)
$fp = fopen('new.csv', 'w');
foreach ($big as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
}
现在您可以将 csv 加载到 db 中。
编辑。 我刚刚尝试使用 720 行这样的数据并复制和粘贴 720 次。
1, ABCDEFGHIJK
没花那么长时间……大概 1-2 秒。
关于php - 解析 CSV 并导入到 PHP 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10676490/