我该如何将CSV文件导入MySQL表中?我希望使用数据的第一行作为列名。
我阅读了如何将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)
你需要先编写一个解释器,找到第一行并将其作为列名分配。
来自MySQL文档LOAD DATA
语法:
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)
IGNORE 1 LINES
。 - mb14LOAD DATA LOCAL INFILE
还是只是LOAD DATA INFILE
? - hjpotter92这是一个简单的PHP命令行脚本,可以完成你需要的功能:
<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$database = 'database';
$db = mysqli_connect($host, $user, $pass) or die ("could not connect to mysql");
mysqli_select_db($db, $database) or die ("no database");
/********************************************************************************/
// 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);";
mysqli_query($db, $create) or die(mysqli_error($db));
/********************************************************************************/
// Import the data into the newly created table.
$file = $_SERVER['PWD'].'/'.$file;
$q = "LOAD DATA INFILE '$file' INTO TABLE $table FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' ignore 1 lines;";
mysqli_query($db, $q) or die(mysqli_error($db));
?>
它将根据第一行创建一个表,并将其余的行导入其中。以下是命令行语法:
php csv_import.php csv_file.csv table_name
ENCASED IN '\"'
添加到 fields terminated by ','
中...它甚至可以处理部分双引号CSV文件。 - Joel MellonENCLOSED BY '\"'
... 此外,如果使用来自Windows的CSV文件,许多人将需要 LINES TERMINATED BY '\r\n'
。最后,用反引号转义字段名称是明智的,以防有空格: $columns .= "\
$column` varchar(250)";` - dlo如果您有安装phpadmin的能力,那么在其中有一个导入部分,您可以将csv文件导入到您的数据库中。甚至有一个复选框可以将文件的第一行标题设置为包含表列名称的行(如果取消选择,则第一行将成为数据的一部分)。
LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
我编写了一些代码来完成这个任务,以下是一些片段:
```$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());
从文本文件或CSV文件加载数据的命令是
load data local infile 'file-name.csv'
into table table-name
fields terminated by '' enclosed by '' lines terminated by '\n' (column-name);
etc/mysql/my.cnf
中。sudo vi /etc/mysql/my.cnf
[mysqld]
local-infile
[mysql]
local-infile
LOAD DATA INFILE
语句允许直接从文件中将数据加载到表中:
LOAD DATA INFILE 'path_to_csv_file'
INTO TABLE your_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
以下是我在Python中使用csv和MySQL Connector完成的方法:
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()
要点
#!/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'
LOAD DATA INFILE
,可以用来读取和格式化CSV文件。它非常强大,但文档不是很完善。这篇文章讲解了如何使用它:https://blog.terresquall.com/2021/11/importing-a-csv-file-into-an-sql-table/ - John Doe