使用加载数据中档时,如何处理带逗号的字段?我有这个查询:
$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 id
、account id
、pg id
、sales value
其中前三列user id
、account id
、pg id
已填充,而1,000,000.00
0列为空,因为用户必须手动填充。。。用户使用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 ', '
...