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
最初に行を読み込んで(上記のように)、検証も挿入もせずに一時配列を作成してから、他の区切り文字で新しい内破を実行して、ファイル内のデータのロードで使用できるようにすることです。
fgetcsv
CSV で 1000 行を超えることはないという事実を覚えておいてください。
編集
私の解決策は、上記のように、配列を作成し、新しい一意の区切り記号で内破することです。
$fp = fopen("file.csv","w");
foreach((array)$oldarray as $val) {
fwrite($fp,implode("*|*",$val)."\r\n");
}
fclose($fp);
この一意の区切り文字を使用すると、LOAD DATA INFILE を問題なく使用できます。