我有一个来自客户端的非标准化事件日记CSV,我正在尝试将其加载到MySQL表中,以便我可以重构为一种理智的格式。我创建了一个名为“CSVImport”的表,它为CSV文件的每一列都有一个字段。 CSV包含99列,因此这本身就足够了:
CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);
表上没有约束,并且所有字段都包含VARCHAR(256)值,但包含计数(由INT表示),是/否(由BIT表示),价格(由DECIMAL表示)和text blurbs(由TEXT表示)。
我尝试将数据加载到文件中:
LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023 Deleted: 0 Skipped: 0 Warnings: 198256
SELECT * FROM CSVImport;
| NULL | NULL | NULL | NULL | NULL |
...
整个表格中填充了NULL
。
我认为问题是文本blurbs包含多行,而MySQL正在解析文件,好像每个新行都对应一个数据行。我可以毫无问题地将文件加载到OpenOffice中。
clientdata.csv文件包含2593行和570条记录。第一行包含列名称。我认为它是逗号分隔的,文本显然是用双引号分隔的。
更新:
如有疑问,请阅读手册:http://dev.mysql.com/doc/refman/5.0/en/load-data.html
我在LOAD DATA
语句中添加了一些信息,表明OpenOffice足够智能推断,现在它加载了正确数量的记录:
LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
但仍然有很多完整的NULL
记录,并且没有任何加载的数据似乎都在正确的位置。
答案 0 :(得分:176)
使用mysqlimport将表格加载到数据库中:
mysqlimport --ignore-lines=1 \
--fields-terminated-by=, \
--local -u root \
-p Database \
TableName.csv
我在http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/
找到了它要将分隔符设为选项卡,请使用--fields-terminated-by='\t'
答案 1 :(得分:119)
问题的核心似乎是将CSV文件中的列与表格中的列匹配。
许多图形化的mySQL客户端都有非常好的导入对话框。
我最喜欢的工作是基于Windows的HeidiSQL。它为您提供了构建LOAD DATA
命令的图形界面;你可以稍后以编程方式重复使用它。
Screenshot: "Import textfile" dialog
要打开“导入文本文件”对话框,请转到Tools > Import CSV file
:
答案 2 :(得分:75)
我导入200多行的最简单方法是在phpmyadmin sql window
中的命令下面我有一个简单的国家表,有两列 CountryId,国家或地区名称
这里是.csv数据
这是命令:
LOAD DATA INFILE 'c:/country.csv'
INTO TABLE country
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
在第二栏中记住一件事,永远不要出现,否则你的导入将停止
答案 3 :(得分:58)
我知道问题是旧的,但我想分享这个
我使用此方法在 0.046sec
中导入超过100K条记录( ~5MB )这是你如何做到的:
LOAD DATA LOCAL INFILE
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);
包含最后一行非常重要,如果你有多个字段,通常它会跳过最后一个字段(MySQL 5.6.17)
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);
然后,假设您的字段有第一行作为标题,您可能还想包含此行
IGNORE 1 ROWS
如果您的文件有标题行,这就是它的样子。
LOAD DATA LOCAL INFILE
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);
答案 4 :(得分:25)
phpMyAdmin 可以处理CSV导入。以下是步骤:
准备CSV文件,使其字段与MySQL表字段的顺序相同。
从CSV中删除标题行(如果有),以便只有数据在文件中。
转到phpMyAdmin界面。
选择左侧菜单中的表格。
点击顶部的导入按钮。
浏览到CSV文件。
选择“使用LOAD DATA的CSV”选项。
在“以...终止的字段”中输入“,”。
输入列名称的顺序与数据库表格中的顺序相同。
点击“转到”按钮即可完成。
这是我为将来的使用做好准备的一个注释,如果其他人可以从中受益,请在这里分享。
答案 5 :(得分:11)
您可以通过列出LOAD DATA语句中的列来解决此问题。来自manual:
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
...所以在你的情况下,你需要按照它们在csv文件中出现的顺序列出99列。
答案 6 :(得分:7)
mysql命令行在导入时容易出现太多问题。这是你如何做到的:
答案 7 :(得分:6)
试试这个,它对我有用
LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;
IGNORE 1 ROWS在这里忽略包含字段名的第一行。请注意,对于文件名,您必须键入文件的绝对路径。
答案 8 :(得分:4)
如果您使用的是MySQL Workbench(目前为6.3版本),您可以通过以下方式执行此操作:
答案 9 :(得分:3)
#Example file:
Overseas_trade_index data CSV File:
Steps:
1.Need to create table for overseas_trade_index.
2.Need to create columns related to csv file.
#SQL Query:
( id int not null primary key auto_increment,
series_reference varchar (60),
period varchar (60),
data_value decimal(60,0),
status varchar (60),
units varchar (60),
magnitude int(60),
subject text(60),
group text(60),
series_title_1 varchar (60),
series_title_2 varchar (60),
series_title_3 varchar (60),
series_title_4 varchar (60),
series_title_5 varchar (60),
);
3.Need to connect mysql database in terminal.
=>show databases;
=>use database;
=>show tables;
#Please enter this command to import the csv data to mysql tables.
#load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);#
=>Find this overseas trade index data on sqldatabase:
#Query:
select * from trade_index;
答案 10 :(得分:3)
我看到一些奇怪的东西。您要为ESCAPING使用与ENCLOSING相同的字符。因此,引擎在找到“''”时不知道该怎么办,我认为这就是为什么似乎没有正确的地方的原因。 我认为,如果删除ESCAPING行,应该运行得很好。喜欢:
LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
除非您分析(手动,直观地...)CSV,并找出哪个字符用于转义。有时是“ \”。但是,如果您没有它,请不要使用它。
答案 11 :(得分:2)
您还可以尝试使用此在线工具,根据您的CSV生成SQL创建/插入语句。 http://www.convertcsvtomysql.com/
我喜欢这个工具:
缺点
答案 12 :(得分:2)
另一种解决方案是使用惊人的csvsql套件中的csvkit工具。
用法示例:
csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename $file
此工具可以自动推断数据类型(默认行为),创建表并将数据插入到创建的表中。 --overwrite
选项可用于删除表(如果已存在)。 --insert
选项-从文件中填充表格。
pip install csvkit
先决条件: python-dev
,libmysqlclient-dev
,MySQL-python
apt-get install python-dev libmysqlclient-dev
pip install MySQL-python
答案 13 :(得分:1)
以下是示例excel文件屏幕截图:
另存为,然后选择.csv。
如果您使用记事本++或任何其他记事本打开,您将拥有如下所示.csv数据屏幕截图。
确保删除标题并在.csv中进行列对齐,如同在mysql表中一样。 用文件夹名称替换folder_name
LOAD DATA LOCAL INFILE
' d:/folder_name/myfilename.csv'
INTO TABLE邮件
FIELDS终止于','
(fname,lname,email,phone);
如果是大数据,你可以拿咖啡加载!。
这就是你需要的一切。
答案 14 :(得分:1)
我使用mysql工作台完成相同的工作。
注意:通过使用“ tail -f [mysqlworkbenchpath] /log/wb*.log”来查看mysql工作台的日志文件中是否有任何错误
答案 15 :(得分:1)
更改服务器名称,用户名,密码,dbname,文件路径,表名以及要插入的数据库中的字段
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "bd_dashboard";
//For create connection
$conn = new mysqli($servername, $username, $password, $dbname);
$query = "LOAD DATA LOCAL INFILE
'C:/Users/lenovo/Desktop/my_data.csv'
INTO TABLE test_tab
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(name,mob)";
if (!$result = mysqli_query($conn, $query)){
echo '<script>alert("Oops... Some Error occured.");</script>';
exit();
//exit(mysqli_error());
}else{
echo '<script>alert("Data Inserted Successfully.");</script>'
}
?>
答案 16 :(得分:1)
PHP查询导入csv文件到mysql数据库
$query = <<<EOF
LOAD DATA LOCAL INFILE '$file'
INTO TABLE users
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(name,mobile,email)
EOF;
if (!$result = mysqli_query($this->db, $query))
{
exit(mysqli_error($this->db));
}
** CSV文件数据示例**
name,mobile,email
Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus
Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
Craig White,516-795-8065,CraigJWhite@inbound.plus
David Whitney,713-214-3966,DavidCWhitney@inbound.plus
答案 17 :(得分:1)
如果您使用的是装有Excel电子表格的Windows机器,那么Excel的新mySql插件就非常出色。 Oracle的员工在该软件上做得非常好。您可以直接从Excel建立数据库连接。该插件将分析您的数据,并以与数据一致的格式为您设置表格。我有一些怪物大的csv数据文件要转换。这个工具节省了大量时间。
http://dev.mysql.com/downloads/windows/excel/
您可以在Excel中进行更新,这些更新将在线填充到数据库中。这对于在超便宜的GoDaddy共享主机上创建的mySql文件非常有效。 (注意在GoDaddy上创建表时,您必须选择一些非标准设置来启用数据库的非现场访问...)
使用此插件,您可以在XL电子表格和在线mySql数据存储之间实现纯粹的交互。
答案 18 :(得分:0)
答案 19 :(得分:0)
我使用phpmyadmin以简单的方式做到了。我按照@Farhan的步骤进行操作,但是所有数据都放在同一列中。 我的工作方式: