5

使用 load data 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命令...

4

6 回答 6

10

您的内容应该看起来像:

"139", "pg89898", "op89890", "1,000,000.00"

然后,您可以将以下内容添加到命令中:

ENCLOSED BY '"' ESCAPED BY "\\"

而且你不会有问题。

此外,如果您没有任何段落或字符串,您可以尝试以下操作,

FIELDS TERMINATED BY ', '
于 2012-08-01T12:30:25.470 回答
1

您将不得不更改正在输入的 CSV 文件或更改生成 CSV 文件的输出 - 听起来一样,但事实并非如此。

您可以通过用引号封装字段来修改传入的数据并更新您的命令,以便它使用类似的命令识别字段是用它们封装的ENCLOSED BY '"'

或者

更改您的输出,使其将数字格式化为 1000000 而不是 1,000,000

于 2012-08-01T12:30:31.647 回答
1

有同样的问题并使用ENCLOSED BY '"'它解决了我的问题,因为我混合了数字和字符串,这正是 ENCLOSED BY 的用途,来自手册:

如果您指定 OPTIONALLY,则 ENCLOSED BY 字符仅用于包含来自具有字符串数据类型(例如 CHAR、BINARY、TEXT 或 ENUM)的列的值:

于 2020-01-01T06:08:05.653 回答
0

在 CSV 中,逗号分隔“列”。由于您的最后一个值是 1,000,000.00,因此它被视为 3 个不同的列,而不是只有一个(如预期的那样)。

您可以通过删除逗号 (,) 来引用每个值(列)或更改数字格式。

于 2012-08-01T12:30:57.663 回答
0

如果您的整个文件与您编写的完全fields terminated by ', '一样,那么当且仅当您在任何单个值中都没有该字符串时,也许您可​​以使用(逗号+空格)。如果您使用的是 Linux(或任何其他类似 Unix 的系统)并且您的字段分隔符是逗号 + 空格,您可以使用sed其他内容替换此分隔符:

sed 's/, /|/g' myfile.csv > myfile.txt

但是,我会推荐已经说过的内容:修改您的输入文件,用引号或双引号将每个值括起来,然后使用fields terminated by ',' optionally enclosed by '"'.

请记住,您的字段终止字符必须是唯一的,并且不得包含在任何单独的值中。

于 2012-08-01T12:38:16.503 回答
0

作为一种解决方法,试试这个 -

LOAD DATA INFILE
...
FIELDS TERMINATED BY ', '
...
于 2012-08-01T12:38:36.613 回答