1

这可能是一个愚蠢的问题,但我似乎无法在谷歌上找到答案或以编程方式创建答案。我有一个巨大的 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

在其他来源中。

4

2 回答 2

2

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

编辑:

只要您的行以正确的顺序排列,以便 1 在第 1 行,2 在第 2 行等,并且您的列的顺序正确:您的 csv 中的公司、联系人、地址_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);

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

于 2012-05-25T17:17:56.037 回答
1

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

从您编辑的问题开始工作:该转换器生成了一个 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','');

;

于 2012-05-25T16:56:33.040 回答