繁体   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