导入CSV到MySQL表

什么是上传一个csv文件到MySQL表的最好/最快的方式? 我想用第一行数据作为列名。

find这个:

如何导入CSV文件到MySQL表

但唯一的答案是使用GUI而不是shell?

您可以不用编写脚本来从CSV文件中获取信息,而是直接将MYSQL链接到它并使用以下SQL语法上载信息。

要将Excel文件导入到MySQL,首先将其导出为CSV文件。 从生成的CSV文件中除去CSV标题以及Excel可能在CSV文件末尾放置的空数据。

然后,您可以通过运行以下命令将其导入到MySQL表中:

load data local infile 'uniq.csv' into table tblUniq fields terminated by ',' enclosed by '"' lines terminated by '\n' (uniqName, uniqCity, uniqComments) 

如下所示:将CSV文件直接导入到MySQL中

编辑

对于你的情况,你需要先编写一个解释器,find第一行,并将它们分配为列名。


编辑-2

LOAD DATA语法的 MySQL文档:

IGNORE number LINES选项可用于忽略文件开始处的行。 例如,您可以使用IGNORE 1 LINES跳过包含列名称的初始标题行:

 LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES; 

因此,您可以使用以下语句:

 LOAD DATA LOCAL INFILE 'uniq.csv' INTO TABLE tblUniq FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (uniqName, uniqCity, uniqComments) 

我曾经有过同样的问题,并写了一个命令行PHP脚本来做到这一点:

http://www.hawkee.com/snippet/8320/

它将根据第一行创build一个表格,并将剩余的行导入到表格中。 这里是命令行语法:

 php csv_import.php csv_file.csv table_name 

如果你有能力安装phpadmin有一个导入部分,你可以导入CSV文件到你的数据库甚至有一个checkbox设置头文件的第一行包含表列名称(如果这是未选中的第一行将成为数据的一部分

首先在数据库中使用csv文件中的相同列数创build一个表。

然后使用以下查询

 LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' 

从文本文件或csv文件加载数据的命令是

 load data local infile 'file-name.csv' into table table-name fields terminated by '' enclosed by '' lines terminated by '\n' (column-name); 

在上面的命令中,在我的情况下,只有一列被加载,所以没有“终止”和“被封闭”,所以我保持空,否则程序员可以input分隔字符。 例如。 ,(逗号)或“或;或任何东西。

**对于使用MySQL版本5及以上的人**

在将文件加载到mysql之前,必须确保在etc/mysql/my.cnf中添加下面的两行

编辑my.cnf命令就是了

sudo vi /etc/mysql/my.cnf

 [mysqld] local-infile [mysql] local-infile 

如果你启动mysql为“mysql -u -p –local-infile”,它将正常工作

我写了一些代码来做到这一点,我会放入一些片段:

 $dir = getcwd(); // Get current working directory where this .php script lives $fileList = scandir($dir); // scan the directory where this .php lives and make array of file names 

然后获取CSV标题,这样你就可以告诉mysql如何导入(注意:确保你的mysql列与csv列完全匹配):

 //extract headers from .csv for use in import command $headers = str_replace("\"", "`", array_shift(file($path))); $headers = str_replace("\n", "", $headers); 

然后将您的查询发送到MySQL服务器:

 mysqli_query($cons, ' LOAD DATA LOCAL INFILE "'.$path.'" INTO TABLE '.$dbTable.' FIELDS TERMINATED by \',\' ENCLOSED BY \'"\' LINES TERMINATED BY \'\n\' IGNORE 1 LINES ('.$headers.') ; ')or die(mysql_error()); 

我为此搏斗了一段时间。 问题不在于如何加载数据,而在于如何构build表来保存数据。 在导入数据之前,您必须生成一个DDL语句来构build表。

如果表格有大量的列,那么特别困难。

这是一个(几乎)完成这个工作的Python脚本:

 #!/usr/bin/python import sys import csv # get file name (and hence table name) from command line # exit with usage if no suitable argument if len(sys.argv) < 2: sys.exit('Usage: ' + sys.argv[0] + ': input CSV filename') ifile = sys.argv[1] # emit the standard invocation print 'create table ' + ifile + ' (' with open(ifile + '.csv') as inputfile: reader = csv.DictReader(inputfile) for row in reader: k = row.keys() for item in k: print '`' + item + '` TEXT,' break print ')\n' 

它解决的问题是最终的字段名称和数据types声明以逗号结尾,而mySQLparsing器将不能容忍这个问题。

当然,它也有问题,它使用每个字段的TEXT数据types。 如果表有几百列,那么VARCHAR(64)会使表太大。

这也似乎打破了mySQL的最大列数。 如果可以的话,现在是时候迁移到Hive或者HBase了。

下面是我使用csv和MySQL连接器在Python中完成的:

 import csv import mysql.connector credentials = dict(user='...', password='...', database='...', host='...') connection = mysql.connector.connect(**credentials) cursor = connection.cursor(prepared=True) stream = open('filename.csv', 'rb') csv_file = csv.DictReader(stream, skipinitialspace=True) query = 'CREATE TABLE t (' query += ','.join('`{}` VARCHAR(255)'.format(column) for column in csv_file.fieldnames) query += ')' cursor.execute(query) for row in csv_file: query = 'INSERT INTO t SET ' query += ','.join('`{}` = ?'.format(column) for column in row.keys()) cursor.execute(query, row.values()) stream.close() cursor.close() connection.close() 

关键点

  • 使用INSERT的准备好的语句
  • 打开'rb'二进制文件中的file.csv
  • 一些CSV文件可能需要调整 ,比如skipinitialspace选项。
  • 如果255不够宽,则会在INSERT上发生错误,必须重新开始。
  • 调整列types,例如: ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • 添加一个主键 ,例如ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

将CSV文件导入到mysql表中

 LOAD DATA LOCAL INFILE 'd:\\Site.csv' INTO TABLE `siteurl` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'; Character Escape Sequence \0 An ASCII NUL (0x00) character \b A backspace character \n A newline (linefeed) character \r A carriage return character \t A tab character. \Z ASCII 26 (Control+Z) \N NULL 

访问: http : //www.webslessons.com/2014/02/import-csv-files-using-php-and-mysql.html

正如其他人所说,本地infile的负载数据工作得很好。 我尝试了Hawkee发布的php脚本,但没有为我工作。 而不是debugging它,这是我做的:

1)将CSV文件的标题行复制/粘贴到一个txt文件中,并用emacs编辑。 在每个字段之间添加一个逗号和CR,以便将它们放在它自己的行上。
2)将该文件保存为FieldList.txt
3)编辑文件以包含每个字段的defns(大多数是varchar,但是其中有很多是int(x)),将create table tablename (到文件的开头)添加到文件的末尾,保存为CreateTable .SQL
4)用Createtable.sql文件的input启动mysql客户端来创build表
5)启动mysql客户端,复制/粘贴大部分'LOAD DATA INFILE'命令,用于replace我的表名和csv文件名。 粘贴在FieldList.txt文件中。 在粘贴现场列表之前,一定要包括“IGNORE 1 LINES”

听起来像很多工作,但容易与Emacs …..

我有谷歌search多种方式导入csv到MySQL,包括“加载数据infile”,使用mysql工作台等

当我使用mysql工作台导入button时,首先需要自行创build空表,并自行设置每个列的types。 注意:您必须在最后添加ID列作为主键,而不是null和auto_increment,否则导入button将在以后不可见。 但是,当我开始加载CSV文件,没有加载,似乎是一个错误。 我放弃。

幸运的是,到目前为止我发现的最简单的方法是使用Oracle的MySQL for excel。 你可以从这里下载它的MySQL为Excel

这是你要做的:在Excel中打开CSV文件,在数据选项卡上,findMySQL的Excel的button

select所有数据,点击导出到mysql。 请注意将ID列设置为主键。

当完成后,去mysql工作台来改变表,如货币types应为十进制(19,4)为大量小数(10,2)经常使用。 其他字段types可能被设置为varchar(255)。