0

CSV のインポート方法を少し試してみます。現時点ではfgetcsv、各行の検証と挿入で使用していますが、これは機能しますが遅いです。そこで、infile代わりにロードデータを使用することを考えました。;CSV は、標準の区切り記号としてExcel によってエクスポートされます。別のユーザーからのものなので、これを変更することはできません。

問題は、HTML と ; の使用を含むことができる 1 つの列です。コードで。

挿入で使用する場合fgetscv、ヘッダーの識別に問題はありません。しかし、ファイル内のデータをロードすると、この区切り文字に確実に問題が発生します。

このように私は今これを行います:

while (($aCell = fgetcsv($handle, 1000, ";")) !== FALSE) {

                    $num = count($aCell);

                    //Run through columns, build array
                    for ($a = 0; $a < $num; $a++) {

                        // IDENTIFY HEADERS
                        switch ($field[$a]) {

                            case ($field_name = "comlumn1"):
                                // DO SOME VALIDATION etc.
                                $array['column1'] =  $aCell[$a];
                                break;
                            case ($field_name = "comlumn2"):
                                // DO SOME VALIDATION etc.
                                $array['column2'] =  $aCell[$a];
                                break;

                            // AND SO ON
                        }   

                    }

                    // INSERT array in db for each row

                }

csv 構造の例:

column1 column2
1       <p style="margin-top: 10;">...

load data infile を使用すると、「;」の列記述の原因で問題が発生します。

LOAD DATA INFILE '/filepath/import.csv' INTO TABLE import_csv
 FIELDS TERMINATED BY ';' 
LINES TERMINATED BY '\n'

私が持っているソリューションはどれですか?1つのアイデアは、fgetscv最初に行を読み込んで(上記のように)、検証も挿入もせずに一時配列を作成してから、他の区切り文字で新しい内破を実行して、ファイル内のデータのロードで使用できるようにすることです。

fgetcsvCSV で 1000 行を超えることはないという事実を覚えておいてください。

編集

私の解決策は、上記のように、配列を作成し、新しい一意の区切り記号で内破することです。

$fp = fopen("file.csv","w");
foreach((array)$oldarray as $val) {
    fwrite($fp,implode("*|*",$val)."\r\n");
}
fclose($fp);

この一意の区切り文字を使用すると、LOAD DATA INFILE を問題なく使用できます。

4

0 に答える 0