我有一个csv文件,如下所示
col1, col2, col3
1 , John, ABC
我需要将第3列中的ABC
解析为A,B,C
,因为新关系需要col1, col3 (each letter)
。
$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.这是一个巨大的数字。
我得到timeout
。我可以在本地更改执行的最长时间,但我需要在我的学生Linux帐户上运行它。我没有这种特权。
我怀疑是因为超时(这次没有说出来),我已经id = 502
了。我错过了其余的(我最多有720行)。
我该怎么办?我只对第一和第三列感兴趣。
答案 0 :(得分:2)
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 doc)
$fp = fopen('new.csv', 'w');
foreach ($big as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
}
现在您可以将csv加载到db。
EDIT。 我只试用了720行数据,并复制和粘贴了720次。
1, ABCDEFGHIJK
没花那么久......也许1-2秒。
答案 1 :(得分:1)
[未测试]
$query = '';
$array = array();
if (($handle = fopen("file.csv", "r")) !== FALSE) {
while (($row = fgetcsv($handle, 1000, ',')) !== false) {
//$total = count($row);
foreach ($row as $key=>$value) {
$chrs = str_split($value[2]);
foreach ($chrs as $chr){
$array[] = {$value[0], $chr} ;
}
}
}
}
foreach ($array as $key=>$value){
$query .= 'INSERT INTO table VALUES ('.$value[0].', "'.$value[1].'")';
}
if ($query <> ''){
mysql_query($query, $connection);
}