這是宣告:
LOAD DATA INFILE '/var/lib/mysql-files/test.csv'
INTO TABLE test
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
這是一條可以正常匯入的行:
1450327840667357185, 1, "This is my text"
如果文本欄位有一個逗號,它就會失敗。例如,請參閱此行:
1450327840667357185, 1, "This is my text, with a comma in it"
為什么會失敗?
如果我轉義逗號(通過在它前面放一個反斜杠)它作業正常。但這沒有意義。我已經規定欄位可以用雙引號括起來,那為什么不接受里面的所有內容作為欄位的內容呢?
如果我必須重新處理所有文本以參考逗號,那將是一項艱巨的任務。
uj5u.com熱心網友回復:
您的 CSV,分隔符后有空格。
我沒有 MySQL 可以玩,但我希望這意味著它將這些空格視為值的一部分,從而導致各種問題。
這意味著 CSV 行被讀取為...
- 價值 =
1450327840667357185 - SEP =
, - 價值 =
1 - SEP =
, - 價值 =
"This is my text - SEP =
, - 價值 =
with a comma in it"
請注意,前導空格包含在值中。
這意味著,第三值并沒有下手" (它以空格開始),所以 ENCLOSED BY '"'沒有做任何事情。這意味著決議器將字串視為unquoted,這反過來意味著后續,被視為分隔符。
試試TERMINATED BY ', '...
這意味著決議器現在將該行讀取為...
- 價值 =
1450327840667357185 - SEP =
, - 價值 =
1 - SEP =
, - 價值 =
"This is my text, with a comma in it"
注意第三個值現在不下手" (因為前導空格現在是分離的一部分),因此是一個參考的字串,因此隨后,被不視為分隔符。
uj5u.com熱心網友回復:
使用輸入預處理。將整行加載到一個變數中,然后將其決議為單獨的列。
LOAD DATA INFILE '/var/lib/mysql-files/test.csv'
INTO TABLE test
-- FIELDS TERMINATED BY ''
(@tmp)
SET column1 = SUBSTRING_INDEX(@tmp, ',', 1),
@tmp = TRIM(SUBSTRING(@tmp FROM 1 LOCATE(',', @tmp))),
column2 = SUBSTRING_INDEX(@tmp, ',', 1),
column3 = TRIM(BOTH '"' FROM TRIM(SUBSTRING(@tmp FROM 1 LOCATE(',', @tmp))))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/324267.html
下一篇:PHP-SQL不保存長文本
