PHP mySQL LOAD LOCAL INFILE 导入正好一半?

标签 php mysql sql

我正在尝试使用 php 脚本将一些 csv 和制表符分隔的 txt 提要导入到我的数据库中。除了这个之外,它们似乎都可以工作。

我有一个基本的 php 脚本,其中包括数据库连接、禁用 key 、导入每个提要(通过 include 语句)并重新启用 key ,然后再导出最终结果。

导致我出现问题的提要就是这个,或者我应该说是 sql 语句。

$sql = "

LOAD DATA LOCAL INFILE '../feeds/feed6.txt'
INTO TABLE supplierimport
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
LINES TERMINATED BY '\\r\n'
IGNORE 1 LINES
(@col1,@col2,@col3,@col4,@col5,@col6,@col7,@col8,@col9,@col10,@col11,@col12,@col13,@col14,@col15,@col16)
SET
DistributorID = 546, MPN=@col1, Brand=@col6, DistributorSKU=@col1, `Condition`=@col15, ProductName=@col2, Cost= replace(@col4, ',', ''), Stock=@col5, EAN=@col12, ImageURL=@col11, ETA=@col7";

database_queryModify($sql,$result);

print "Imported...";

因此,有两个问题:

  1. 这个说法正确吗? Cost= Replace(@col4, ',', ''), 我使用此语句的原因是因为我将每个供应商的成本导入到 cost 列中我的数据库,但这个特定的供应商使用千位分隔符,即 1000.53 在提要中显示为 1,000.53,因此无法正确导入到我的数据库中,所以我找到了替换功能,但想验证我在这种情况下是否正确使用它?

  2. 文件中的一半行正在导入到我的数据库中。我发现了这个问题; mysql load data local infile syntax issues with set fields正如你所看到的,我已经输入了\r\n,但它仍然没有导入全部。

谁能帮忙。

谢谢

编辑:作为示例,逗号分隔的文本文件中只有三行。这是从文件中按原样粘贴的,因此我没有在每行之间放置额外的行。另外,在第 3 行,您将看到价格为“1,117.00”,以显示千位分隔符的工作原理:

"Item No.","Description","Description 2","Customers Price","Home stock","Brand Name","Expected date for delivery","Item Group No.","Item Group Name","Item Product Link (Web)","Item Picture Link (Web)","EAN/UPC","Weight","UNSPSC code","Product type code","Warranty"

"/5PL0006","Drum Unit","DK-23","126.00","32","Kyocera","03/11/2013","800002","Drums","http://uk.product.com/product.aspx?id=%2f5PL0006","http://s.pic.eu/products/2_PICTURE-TAKEN.JPG","5711045360824","0.30","44103109","","3M"

"/DK24","DK-24 Drum Unit FS-3750","","1,117.00","8","Dell","07/11/2013","800002","Drums","http://uk.product.com/product.aspx?id=%2fDK24","http://s.pic.eu/products/2_PICTURE-TAKEN.JPG","5711045360718","0.20","44103109","","3M"

最佳答案

假设您的表格看起来像这样

CREATE TABLE supplierimport 
(
distributorid int, 
MPN varchar(32),
description varchar(100),
description2 varchar(100),
customers_price decimal(19,2),
home_stock int,
brand_name varchar(100),
delivery_date date,
item_group_number varchar(32),
item_group_name varchar(100),
product_link varchar(255),
picture_link varchar(255),
barcode varchar(32),
weight decimal(19,4),
UNSPSC varchar(32),
product_type_code varchar(32),
warranty varchar(32)
);

这将使您成功加载数据

LOAD DATA LOCAL INFILE '/path/to/feed6.txt'
INTO TABLE supplierimport
    FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    LINES TERMINATED BY '\n' -- or '\r\n' in your case
IGNORE 1 LINES
(MPN, @description, @description2, @customers_price, @home_stock, @brand_name, @delivery_date, 
 @item_group_number, @item_group_name, @product_link, @picture_link, @barcode, @weight, @UNSPSC, @product_type_code, @warranty)
SET distributorid = 546, 
    description       = NULLIF(@description, ''),
    description2      = NULLIF(@description2, ''),
    customers_price   = REPLACE(NULLIF(@customers_price), ',', ''), 
    home_stock        = NULLIF(@home_stock, ''), 
    brand_name        = NULLIF(@brand_name, ''), 
    delivery_date     = STR_TO_DATE(NULLIF(@delivery_date, ''), '%d/%m/%Y'), 
    item_group_number = NULLIF(@item_group_number, ''), 
    item_group_name   = NULLIF(@item_group_name, ''), 
    product_link      = NULLIF(@product_link, ''), 
    picture_link      = NULLIF(@picture_link, ''), 
    barcode           = NULLIF(@barcode, ''), 
    weight            = NULLIF(@weight, ''), 
    UNSPSC            = NULLIF(@UNSPSC, ''), 
    product_type_code = NULLIF(@product_type_code, ''), 
    warranty          = NULLIF(@warranty, '');

我机器上的结果

mysql> select * from supplierimport;
+---------------+----------+-------------------------+--------------+-----------------+------------+------------+---------------+-------------------+-----------------+--------------------------------------------------+----------------------------------------------+---------------+--------+----------+-------------------+----------+
| distributorid | MPN      | description             | description2 | customers_price | home_stock | brand_name | delivery_date | item_group_number | item_group_name | product_link                                     | picture_link                                 | barcode       | weight | UNSPSC   | product_type_code | warranty |
+---------------+----------+-------------------------+--------------+-----------------+------------+------------+---------------+-------------------+-----------------+--------------------------------------------------+----------------------------------------------+---------------+--------+----------+-------------------+----------+
|           546 | /5PL0006 | Drum Unit               | DK-23        |          126.00 |         32 | Kyocera    | 2013-11-03    | 800002            | Drums           | http://uk.product.com/product.aspx?id=%2f5PL0006 | http://s.pic.eu/products/2_PICTURE-TAKEN.JPG | 5711045360824 | 0.3000 | 44103109 | NULL              | 3M       |
|           546 | /DK24    | DK-24 Drum Unit FS-3750 | NULL         |         1117.00 |          8 | Dell       | 2013-11-07    | 800002            | Drums           | http://uk.product.com/product.aspx?id=%2fDK24    | http://s.pic.eu/products/2_PICTURE-TAKEN.JPG | 5711045360718 | 0.2000 | 44103109 | NULL              | 3M       |
+---------------+----------+-------------------------+--------------+-----------------+------------+------------+---------------+-------------------+-----------------+--------------------------------------------------+----------------------------------------------+---------------+--------+----------+-------------------+----------+
2 rows in set (0.01 sec)

关于PHP mySQL LOAD LOCAL INFILE 导入正好一半?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634423/

相关文章:

php - 为复选框提供的参数无效

php - php 和 select mysql 之间的比较问题

php - 博客中的文章作者不显示

php - 在 PayPal 中更改金额值

php - 无法在 Symfony 中创建索引列

php - MySQL SELECT 条件基于最后一行和日期间隔

mysql - SQL 语法不正确附近

SQL 麻烦的考试查询

php curl 模拟浏览器?

php - Laravel 创建方法