簡體   English   中英

加載數據 infile,用逗號處理字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM