1

リモートテキストファイルをダウンロードして、ローカルのmysqlデータベースにインポートしています。

フォーマットが最近変更され、列の1つにコンマが含まれるようになり、「1行目のCSV入力のフィールド数が無効です」というエラーでインポートが失敗します。データは次のようになります。

"bonita","FL","212025920","2012929","Hooker,Bill"

このコードスニペットを更新して、引用符で囲むことができるようにするにはどうすればよいですか?

foreach(explode($lineseparator,$csvcontent) as $line) {

    $lines++;

    $line = trim($line," \t");

    $line = str_replace("\r","",$line);

    /************************************
    This line escapes the special character. remove it if entries are already escaped in the csv file
    ************************************/
    $line = str_replace("'","\'",$line);
    /*************************************/

    $linearray = explode($fieldseparator,$line);

    $linemysql = implode("','",$linearray);

    $linemysql = str_replace("\"","",$linemysql);###code added

        $query = "insert ignore into $databasetable values('$linemysql');";
4

3 に答える 3

3

LOAD DATA LOCAL INFILEオプションをFIELDS TERMINATED BY ',' ENCLOSED BY '"'使用すると、ファイルを直接読み取る必要があります。また、標準のステートメントLOAD DATA INFILEよりも高速です。INSERT

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

これは近いですが、TRIM()がタブを削除しているとは思いません。

LOAD DATA LOCAL INFILE '/my/local/file/path.csv' IGNORE INTO TABLE mytable FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' (@a, @b, @c, @d, @e) SET col1=TRIM(@a), col2=TRIM(@b), col3=TRIM(@c), col4=TRIM(@d) col5=TRIM(@e)

于 2012-11-04T14:18:20.337 に答える
2

関数を次のように書き換えます。

     foreach(explode($lineseparator,$csvcontent) as $line) {

        $lines++;
        $line = trim($line," \t");
        $line = str_replace("\r","",$line);

        $lineArray = str_getcsv($line, ",", '"');
        $linemysql = implode("','",$lineArray);
         $query = "insert ignore into $databasetable values('$linemysql');";
        //.. Handle  the rest

     }

PHP の getcsv 関数が区切り文字を処理し、囲みを追跡します - これらの頭痛の種から解放されます。

次のスニペット:

   $line = '"bonita","FL","212025920","2012929","Hooker,Bill"';
   $array = str_getcsv($line, ",", '"');
   print_r($array);

出力:

   Array ( [0] => bonita [1] => FL [2] => 212025920 [3] => 2012929 [4] => Hooker,Bill )
于 2012-11-04T14:31:06.107 に答える
0

サンプルテーブル:

CREATE TABLE `table1` (
    `id` VARCHAR(50) NULL DEFAULT NULL,
    `a1` VARCHAR(50) NULL DEFAULT NULL,
    `b1` VARCHAR(50) NULL DEFAULT NULL,
    `c1` VARCHAR(50) NULL DEFAULT NULL,
    `d1` VARCHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoD1B;

インポートクエリ:

load data local infile 'd:/import.csv' into table table1 fields terminated by ','
enclosed by '"'
lines terminated by '\r\n'
(id, a1, b1, c1, d1)

import.csv

"bonita1","FL1","212025920","2012929","Hooker,Bill"
"bonita2","FL2","212025920","2012929","Hooker,Bill"
"bonita3","FL3","212025920","2012929","Hooker,Bill"
于 2012-11-04T14:19:17.720 に答える