将csv文件上传到mysql表的最佳/最快方法是什么?我想将第一行数据用作列名。
发现这个:
How to import CSV file to MySQL table
但唯一的答案是使用GUI而不是shell?
答案 0 :(得分:146)
您可以直接将MYSQL链接到它并使用以下SQL语法上传信息,而不是编写脚本以从CSV文件中提取信息。
要将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)
阅读:Import CSV file directly into MySQL
对于您的情况,您需要先编写一个解释器,以查找第一行,并将它们指定为列名。
来自MySQL文档on LOAD DATA
syntax:
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)
答案 1 :(得分:23)
这是一个简单的PHP命令行脚本,可以满足您的需求:
<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$database = 'database';
$db = mysql_connect($host, $user, $pass);
mysql_query("use $database", $db);
/********************************************************************************/
// Parameters: filename.csv table_name
$argv = $_SERVER[argv];
if($argv[1]) { $file = $argv[1]; }
else {
echo "Please provide a file name\n"; exit;
}
if($argv[2]) { $table = $argv[2]; }
else {
$table = pathinfo($file);
$table = $table['filename'];
}
/********************************************************************************/
// Get the first row to create the column headings
$fp = fopen($file, 'r');
$frow = fgetcsv($fp);
foreach($frow as $column) {
if($columns) $columns .= ', ';
$columns .= "`$column` varchar(250)";
}
$create = "create table if not exists $table ($columns);";
mysql_query($create, $db);
/********************************************************************************/
// Import the data into the newly created table.
$file = $_SERVER['PWD'].'/'.$file;
$q = "load data infile '$file' into table $table fields terminated by ',' ignore 1 lines";
mysql_query($q, $db);
?>
它将根据第一行创建一个表,并将剩余的行导入其中。这是命令行语法:
php csv_import.php csv_file.csv table_name
答案 2 :(得分:4)
首先在数据库中创建一个表,其中csv文件中的列数相同。
然后使用以下查询
LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
答案 3 :(得分:4)
如果你有能力安装phpadmin,你可以在其中导入csv文件导入到你的数据库,甚至还有一个复选框,用于设置包含表列名称的文件第一行的标题(如果是未经检查,第一行将成为数据的一部分
答案 4 :(得分:3)
要从文本文件或csv文件加载数据,命令为
load data local infile 'file-name.csv'
into table table-name
fields terminated by '' enclosed by '' lines terminated by '\n' (column-name);
在上面的命令中,在我的情况下,只有一列要加载,因此没有&#34;由&#34; &#34;由&#34;包围所以我把它保持为空,程序员可以输入分离字符。例如。 ,(逗号)或&#34;要么 ;或任何事情。
**适用于使用mysql版本5及以上版本**的人
在将文件加载到mysql之前,必须确保在etc/mysql/my.cnf
编辑my.cnf命令是
sudo vi /etc/mysql/my.cnf
[mysqld]
local-infile
[mysql]
local-infile
答案 5 :(得分:3)
如果启动mysql为&#34; mysql -u -p --local-infile&#34;,它将正常工作
答案 6 :(得分:2)
我和这个人争吵了一段时间。问题不在于如何加载数据,而在于如何构造表来保存数据。在导入数据之前,必须生成一个DDL语句来构建表。
如果表格中有大量列,则特别困难。
这是一个(几乎)完成工作的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'
它要解决的问题是最终的字段名称和数据类型声明以逗号结束,而mySQL解析器不会容忍它。
当然它还有一个问题,它为每个字段使用TEXT数据类型。如果表有几百列,那么VARCHAR(64)将使表太大。
这似乎也打破了mySQL的最大列数。如果你能够,那么现在是时候搬到Hive或HBase了。
答案 7 :(得分:2)
我写了一些代码来做这件事,我会写几个片段:
$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());
答案 8 :(得分:1)
以下是我使用csv和MySQL Connector在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()
关键点
'rb'
二进制文件skipinitialspace
选项。255
不够宽,您就会在INSERT上遇到错误并且必须重新开始。ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;
答案 9 :(得分:0)
将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
答案 10 :(得分:0)
正如其他人所提到的,本地infile的加载数据工作得很好。我尝试了Hawkee发布的php脚本,但对我没有用。而不是调试它,这是我做的:
1)将CSV文件的标题行复制/粘贴到txt文件中,并使用emacs进行编辑。在每个字段之间添加一个逗号和CR,以便在每个字段上添加一个逗号和CR
2)将该文件保存为FieldList.txt
3)编辑文件以包含每个字段的defns(大多数是varchar,但是很多是int(x)。添加create table tablename (到文件的开头)到结尾该文件。保存为CreateTable.sql
4)使用Createtable.sql文件中的输入启动mysql客户端以创建表
5)启动mysql客户端,复制/粘贴大部分'LOAD DATA INFILE'命令,替换我的表名和csv文件名。粘贴在FieldList.txt文件中。在粘贴到字段列表中之前,请务必包含“IGNORE 1 LINES”
听起来很多工作,但很容易使用emacs .....
答案 11 :(得分:0)
使用TablePlus应用程序: 右键单击右侧面板中的表名 选择导入...>从CSV 选择CSV文件 查看列匹配并点击导入 全部完成!
答案 12 :(得分:-2)
我有谷歌搜索很多方法将csv导入mysql,包括“加载数据infile”,使用mysql workbench等。
当我使用mysql workbench导入按钮时,首先需要自己创建空表,自己设置每个列类型。注意:您必须在末尾添加ID列作为主键,而不是null和auto_increment,否则,导入按钮将在以后不可见。但是,当我开始加载CSV文件时,没有任何加载,似乎是一个bug。我放弃。
幸运的是,到目前为止我发现的最简单方法是使用Oracle的mysql for excel。你可以从这里下载mysql for excel
这是你要做的: 在excel中打开csv文件,在Data选项卡中,找到mysql for excel按钮
选择所有数据,单击导出到mysql。 注意将ID列设置为主键。
完成后,转到mysql workbench来改变表, 例如货币类型应为十进制(19,4),用于常规使用的大量小数(10,2)。 其他字段类型可以设置为varchar(255)。