0

私は、CSVファイルをMySQLデータベースに定期的にアップロードするスクリプトに取り組んでいます。問題は、CSVファイルのフィールドの1つに、ユーザーが生成したテキストが含まれていることです。このテキストには、MySQLに適さない引用符やその他の文字が含まれている場合があります。

CSVファイルをアップロードする最も効率的な方法は、MySQLの「LOADDATAINFILE」コマンドを使用することであると判断しました。CSVをアップロードしたときにMyPHPAdminに表示されるコマンドは次のとおりです。

LOAD DATA LOCAL INFILE '/home/myfolder/tmp/property_re_1.csv' REPLACE INTO TABLE `markers`
    FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\'
    LINES TERMINATED BY '\r\n' # 2 rows affected.

このコマンドを使用してCSVをロードするだけでは機能しません。これは、プロセスが「」に達するとすぐに終了し、「ESCAPEDBY」\「」がその目的を果たしていないように見えるためです。

この場合、最初にPHPを使用してプログラムでCSVファイルの引用符をエスケープする必要があると思います。次に、SQLのLOAD DATA INFILEコマンドを使用して、「エスケープされた」ファイルをMySQLにロードします。

これは、「ベストプラクティス」の解決策がある一般的な問題であると確信しています。基本的に、私のスクリプトは、CSVファイルをMYSQLテーブルにロードする前に「クリーンアップ」する必要があります。

これは、賢明な心がこれに頭を悩ませるのを助けるために私が取り組んでいる実際のSQLテーブルとCSVファイルへのリンクです:https ://www.dropbox.com/sh/4iq10i51qlqyq8q/UjEQwvXKDA

よろしくお願いします。

4

1 に答える 1

2

ドロップボックスのデータファイルには、ヘッダー行で区切られ、ヘッダー行を含む行で区切られた,、オプションで囲まれた、で区切られたフィールドがあります。上記のステートメントは、フィールドがで区切られ、常にで囲まれ、行がで区切られ、ヘッダー行を含まないファイルに対するものです。"\n;"\r\n

data.csvとは言うものの、Dropbox上のファイルの名前がであるのに対し、それはという名前のファイルの場合でもありますproperty_re_1.csv

mysql> CREATE TABLE IF NOT EXISTS `markers` (
    ->    `L_ListingID` int(20) NOT NULL,
    ->    `L_Class` int(5) NOT NULL,
    ->    `L_Type_` int(10) NOT NULL,
    ->    `L_Status` varchar(10) NOT NULL,
    ->    `L_AskingPrice` float NOT NULL,
    ->    `L_Remarks` text NOT NULL,
    ->    `L_Address` varchar(50) NOT NULL,
    ->    `L_City` text NOT NULL,
    ->    `L_State` varchar(10) NOT NULL,
    ->    `LO1_OrganizationName` varchar(65) NOT NULL,
    ->    `LA1_AgentLicenseID` int(20) NOT NULL,
    ->    `LA1_UserFirstName` varchar(50) NOT NULL,
    ->    `LA1_UserLastName` varchar(50) NOT NULL,
    ->    `L_PictureCount` int(4) NOT NULL,
    ->    PRIMARY KEY (`L_ListingID`)
    ->) ENGINE=MyISAM DEFAULT CHARSET=latin1;
クエリOK、影響を受ける行は0(0.21秒)

mysql>LOAD DATA LOCAL INFILE 'property_re_1.csv' 
    -> REPLACE INTO TABLE `markers`
    -> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
    -> LINES TERMINATED BY '\n' IGNORE 1 LINES;
クエリOK、315行が影響を受けました(0.01秒)
レコード:315削除:0スキップ:0警告:0
于 2012-12-17T20:54:39.850 に答える