1

我有一个 csv 文件,看起来像这样

col1, col2, col3
1 ,  John, ABC

我需要ABC在第 3 列中解析为,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
}
  1. 这很慢。我有超过 720 行,其中大多数在第三列中有超过 5 个字符。ABCDE,所以我们平均有 720 x 5。这是一个巨大的数字。我明白了timeout。我可以更改本地执行的最长时间,但我需要在我的学生 linux 帐户上运行它。我没有那种特权。

  2. 我怀疑是因为超时(这次没有说),我已经起来了id = 502。我错过了其余的(我最多有 720 行)。

我能做些什么?我只对第一列和第三列感兴趣。

4

2 回答 2

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、一个

1、乙

这是写入 csv 的代码(来自 php doc)

$fp = fopen('new.csv', 'w');

foreach ($big as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);

}

现在您可以将 csv 加载到数据库中。


编辑。我刚刚尝试了 720 行这样的数据,并复制和粘贴了 720 次。

1, ABCDEFGHIJK

没花那么长时间......也许1-2秒。

于 2012-05-20T19:52:42.607 回答
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);
}
于 2012-05-20T19:59:01.923 回答