【问题标题】:Import CSV into MySQL - With Fields Already Established将 CSV 导入 MySQL - 已建立字段
【发布时间】:2012-06-01 06:34:12
【问题描述】:

这可能是一个愚蠢的问题,但我似乎无法在谷歌上找到答案或以编程方式创建答案。我有一个巨大的 CSV 文件,名为 contacts2.csv(逗号分隔),我想将其导入我的 MySQL 数据库。现在棘手的部分是我已经在数据库中有一堆字段,我想将数据放入其中,但它们与 CSV 不匹配。

例如,CSV 上的第一列可能是“公司”,但实际上它是 MySQL 上的第 5 列。我还有一个自动增量“id”列,当前为 129483653,我希望在导入这些列时保持自动增量。

我在网上找到了一些脚本来显示数据并导入新表,但我需要将所有这些记录添加到现有表中而不覆盖任何内容。

谢谢

我使用了一个 CSV 到 MySQL 的转换器,并将它作为我的输出:

CREATE TABLE `tempcontacts` ( 
`company` varchar(255) NOT NULL DEFAULT '', 
`contact` varchar(255) NOT NULL DEFAULT '', 
`address_1` varchar(255) NOT NULL DEFAULT '', 
`city` varchar(255) NOT NULL DEFAULT '', 
`state` varchar(255) NOT NULL DEFAULT '', 
`zip` varchar(255) NOT NULL DEFAULT '', 
`phone` varchar(255) NOT NULL DEFAULT '', 
`fax` varchar(255) NOT NULL DEFAULT '', 
`title` varchar(255) NOT NULL DEFAULT '', 
`phone_ext_` varchar(255) NOT NULL DEFAULT '', 
`web_site` varchar(255) NOT NULL DEFAULT '', 
`e_mail` varchar(255) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `tempcontacts` VALUES 
('Construction', 'Bill Billy', '4201 State Route 1', 'Orlando', 'FL', '11111', '312-922-2125', '', '', '235', 'www.construction.com', ''), 

这不能只是以某种方式切换到我的实际表“联系人”的“插入”命令吗?

更新:我想我可能需要有人帮我写一些自定义的东西才能完成所有这些。我试过了:

http://www.codewalkers.com/c/a/Database-Code/PHP-CSV-Importer-20/

http://www.geeklog.net/forum/viewtopic.php?showtopic=71161

在其他来源中。

【问题讨论】:

标签: php mysql csv import


【解决方案1】:

来自每周十几次走这条路的人的话。导入临时表并使用 SQL 引擎或 PHP 脚本从那里找出它的优点远远超过了尝试匹配/映射和希望的痛苦。早些时候回答了这个here。只是我的看法,我可能错了。

处理您编辑的问题:该转换器生成了一个 INSERT 语句,您可以修改这样的内容。将您的表格更改为最终表格,并将显示的列名调整为最终表格中的实际列,而不更改它们的顺序(列名必须与下面的数据顺序相同,但不必与它们在表结构中的顺序相同)

INSERT INTO `contacts` 
(`company`, `contact`, `address_1`, `city`, `state`, `zip`, `phone`, `fax`, `title`,     `phone_ext_`, `web_site`, `e_mail`) 
VALUES
('Construction1','Bill Billy','4201 State Route 1','Orlando','FL','11111','312-922-2125','','','235','www.construction.com',''),
('Construction2','Bill Billy','4201 State Route 1','Orlando','FL','11111','312-922-2125','','','235','www.construction.com','');

;

【讨论】:

    【解决方案2】:

    我认为您最好的选择是将您的 mysql 表重新排序为您的 csv 文件顺序。然后只需按照您想要的顺序重新排序 mysql 表。 这是一个时髦的工作。 即使你搞乱了顺序,一切都是 var(255) 所以你可以重命名列

    编辑:

    只要您的行顺序正确,即 1 在第 1 行,2 在第 2 行,依此类推。 并且您的列的顺序正确:您的 csv 中的 Company、contact、address_1 等以匹配您的表格,然后您可以使用 Data Infile 脚本

    http://dev.mysql.com/doc/refman/5.0/en/load-data.html

    我必须导入 csv 文件的示例:

    LOAD DATA INFILE '/usr/name/file.csv' INTO TABLE `mytable`
    COLUMNS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n';
    

    然后只需使用 auto_increment 添加列主键

    我使用它是因为有人有一个 Excel 表,其中包含我需要一次导入数据库的一堆东西。 我还在学习数据库的一切,所以我不知道如果你把它作为一个例程脚本是否存在安全风险。

    编辑:

    使用来自http://dev.mysql.com/doc/refman/5.0/en/load-data.html的示例之一

    LOAD DATA INFILE '#{DATA_FILE_NAME}' IGNORE
    INTO TABLE zipcodes
    FIELDS TERMINATED BY ','
    ENCLOSED BY '\"'
    LINES TERMINATED BY '\\n'
    (city, state_code, @zip, area_code, county_fips, county_name, @preferred, timezone, 
    dst, lat, lon, msa, pmsa, @city_abbreviation, ma, zip_type)
    

    为此,您的 CSV 文件中的所有行(行)都应遵循相同的模式。所以说:公司的顺序,ownerid,name,title,address,然后是硬输入(\n)

    应该是这样的

    PharmacyPlace, 2222, Bob Pills, Pharmacists Awesome Man, 51 Main st
    Walmart, 12331, Anna Smith, Manager, 99 main st
    

    保持相同的模式

    如果您的线路有任何其他方式,那么您将不得不修复它 但如果你有:

    Taco Bell,,,Manager, 59 Main st
    

    然后每个逗号都会告诉它转到下一列。

    所以这个例子上传到你的数据库的脚本是

    LOAD DATA INFILE 'DATA_FILE_NAME' INTO TABLE `your table`
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    (company, ownerid, name, title, address);
    

    我会先备份你的表,然后将它复制到另一个表作为临时表来测试这一切。您将不得不进行一些试验和错误。就像我说的一个时髦的解决方案。

    【讨论】:

    • 嘿,谢谢你的回答——我不认为我能做到这一点。有太多的函数和查询按行号而不是行名来拉。:(
    • 如果你把它放回正确的顺序应该不是问题。您要做的就是将数据从 csv 获取到数据库中。问题是您无法重新排列 csv 但您可以重新排列表格。获得表中的所有数据后,您可以按正确的顺序将列移回,即:ALTER tempcontacts MODIFY COLUMN contact VARCHAR(255) AFTER company;
    • 我可以重新排列 CSV 文件。我只需要能够导入 CSV 和自动增量来完成它的工作。你能用建议的脚本更新你的答案吗?
    • LOAD DATA INFILE 允许您指定字段,因此您不必重新安排任何内容。如果您在 csv 文件中省略自动增量字段,它将为您生成一个值。
    • 问题:您从 csv 文件添加的人员是继续自动增量还是他们有自己的自动增量?所以说你的表现在以 100 结束,你的 csv 文件是否从 101 开始?还是从 1 开始?
    猜你喜欢
    • 2017-02-05
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多