[英]load data infile, dealing with fields with comma
使用加載數據 infile 時如何處理帶逗號的字段? 我有這個查詢:
$sql = "LOAD DATA LOCAL INFILE '{$file}' INTO TABLE sales_per_pgs
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(@user_id, @account_code, @pg_code, @sales_value)
SET
user_id = @user_id,
account_code = @account_code,
product_group_code = @pg_code,
sales_value = REPLACE(@sales_value, ',', ''),
company_id = {$company_id},
year = {$year},
month = {$month}";
來自 csv 的一行看起來像這樣:
139, pg89898, op89890, 1,000,000.00
其中1,000,000.00
是銷售值。
目前,插入到我的數據庫中的只有"1
.
編輯
用戶下載一個包含以下列的表單:
user id
, account id
, pg id
, sales value
其中前三列user id
, account id
, pg id
已填充,而sales value
列為空,因為用戶必須手動填寫...用戶使用 MS excel 來執行此操作...
表格完成后,他現在將上傳它,我在其中使用load data infile
命令...
您的內容應該看起來像:
"139", "pg89898", "op89890", "1,000,000.00"
然后你可以在命令中添加以下內容:
ENCLOSED BY '"' ESCAPED BY "\\"
而且你不會有問題。
此外,如果您沒有任何帶有,
段落或字符串,您可以嘗試一些東西:
FIELDS TERMINATED BY ', '
您必須更改正在輸入的 CSV 文件或更改生成 CSV 文件的輸出 - 聽起來相同,但事實並非如此。
您可以通過用引號封裝字段來修改傳入的數據並更新您的命令,以便它使用ENCLOSED BY '"'
類的命令識別字段是用它們封裝ENCLOSED BY '"'
要么
更改您的輸出,以便將數字格式化為 1000000 而不是 1,000,000
有同樣的問題,只使用ENCLOSED BY '"'
這解決了我的問題,因為我混合了數字和字符串,這正是 ENCLOSED BY 的用途,來自手冊:
如果指定 OPTIONALLY,則 ENCLOSED BY 字符僅用於將具有字符串數據類型(例如 CHAR、BINARY、TEXT 或 ENUM)的列中的值括起來:
在 CSV 中,逗號分隔“列”。 由於您的最后一個值是 1,000,000.00,因此它被視為 3 個不同的列,而不是一個(如預期的那樣)。
您可以通過刪除逗號 (,) 來引用每個值(列)或更改數字格式。
如果您的整個文件與您所寫的完全一樣,那么也許您可以使用fields terminated by ', '
(逗號 + 空格) fields terminated by ', '
,當且僅當您在任何單個值中都沒有該字符串時。 如果您使用的是 Linux(或任何其他類似 Unix 的系統)並且您的字段分隔符是逗號 + 空格,您可以使用sed
用其他內容替換此分隔符:
sed 's/, /|/g' myfile.csv > myfile.txt
但是,我會推薦已經說過的內容:修改您的輸入文件,用引號或雙引號將每個值括起來,並使用fields terminated by ',' optionally enclosed by '"'
。
請記住,您的字段終止字符必須是唯一的,並且不得包含在任何單個值中。
作為一種解決方法,試試這個 -
LOAD DATA INFILE
...
FIELDS TERMINATED BY ', '
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.