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