在文件中加载数据,用逗号处理字段


load data infile, dealing with fields with comma

使用加载数据中档时,如何处理带逗号的字段?我有这个查询:

$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

其中CCD_ 1是销售值。

目前,在我的数据库中插入的只有"1

编辑

用户下载一个包含以下列的表单:

user idaccount idpg idsales value

其中前三列user idaccount idpg id已填充,而1,000,000.000列为空,因为用户必须手动填充。。。用户使用MS excel来完成。。。

表单完成后,他现在将上传它,我在其中使用load data infile命令。。。

您的内容应该看起来像:

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

然后您可以在命令中添加以下内容:

ENCLOSED BY '"' ESCAPED BY "''"

你不会有问题的。

此外,如果你没有任何包含,的段落或字符串,你可以尝试一下:

FIELDS TERMINATED BY ', '

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

您可以通过用引号封装字段来修改输入的数据,并更新您的命令,使其识别出字段是使用ENCLOSED BY '"' 等命令封装的

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

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

如果指定OPTIONALLY,则ENCLOSED BY字符仅用于将具有字符串数据类型(例如CHAR、二进制、TEXT或ENUM):

在CSV中,comas separate"columns"。由于您的最后一个值是1000000.00,因此它被视为3个不同的列,而不是一个单独的列(按预期)。

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

如果您的整个文件与您所写的完全,那么也许您可以使用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 ', '
...