加载数据infile,用逗号处理字段

时间:2012-08-01 12:27:34

标签: php mysql load-data-infile

在使用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 idaccount idpg idsales value

前三列user idaccount idpg id已填充且sales value列为空,因为用户必须手动填写...用户使用MS excel来做到这一点......

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

6 个答案:

答案 0 :(得分:7)

您的内容应该如下:

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

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

ENCLOSED BY '"' ESCAPED BY "\\"

你不会有问题。

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

FIELDS TERMINATED BY ', '

答案 1 :(得分:1)

您必须更改正在输入的CSV文件或更改生成CSV文件的输出 - 声音相同但不是。

您可以使用引号修改封装字段所带来的数据并更新您的命令,以便使用ENCLOSED BY '"'

之类的命令识别字段是否封装了它们

更改输出,使其将数字格式设置为1000000而不是1,000,000

答案 2 :(得分:0)

在CSV中,comas将“列”分开。由于您的上一个值为1,000,000.00,因此它被视为3个不同的列,而不是一个(按预期)。

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

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

LOAD DATA INFILE
...
FIELDS TERMINATED BY ', '
...

答案 5 :(得分:0)

遇到了同样的问题,只使用了ENCLOSED BY '"'来解决了我的问题,因为我混合了数字和字符串,这恰恰是手册中ENCLOSED BY的意思:

  

如果指定OPTIONALLY,则ENCLOSED BY字符仅用于   封闭具有字符串数据类型(例如   CHAR,BINARY,TEXT或ENUM):