1

私はこのようなcsvファイルを持っています

col1, col2, col3
1 ,  John, ABC

新しい関係が必要なので、ABC列 3 で解析する必要があります。A,B,Ccol1, 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 を超える行があり、そのほとんどは 3 列目に 5 文字を超えています。ABCDEですので、平均すると 720 x 5 になります。これは膨大な数です。私は得るtimeout。実行の最大時間をローカルで変更できますが、学生の Linux アカウントでこれを実行する必要があります。私にはそんな特権はありません。

  2. タイムアウトのせいだと思います(今回は言われませんでした)、私は を持っていid = 502ます。残りがありません(最大720行あります)。

私に何ができる?私が興味を持っているのは、最初と 3 番目の列だけです。

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、A

1、B

これがcsvに書き込むコードです(php docから)

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

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

}

これで、csvをdbにロードできます。


編集。このようなデータを含む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 に答える