使用 CSV 存储引擎直接从 CSV 文件创建 mysql 表?
Posted
技术标签:
【中文标题】使用 CSV 存储引擎直接从 CSV 文件创建 mysql 表?【英文标题】:Create mysql table directly from CSV file using the CSV Storage engine? 【发布时间】:2012-04-17 10:07:27 【问题描述】:我刚刚了解到 mysql 有一个本机 CSV storage engine,它将数据存储在每个表的逗号分隔值文件中。
是否可以直接从上传的 CSV 文件创建表格,例如:
CREATE TABLE USERS < PATH/USERS.CSV
users.csv
是用户上传到哪里的?
【问题讨论】:
不完全是答案,但您可能指的是 LOAD DATA INFILE dev.mysql.com/doc/refman/5.1/en/load-data.html ,其文本文件类似于 CSV 结构化文件。 您可以使用此工具 (csv-schema.surge.sh) 将 CSV 转换为 CREATE TABLE(带有架构)。它尝试猜测字段类型(非常好)。 我发现PostgreSQL可以直接用file_fdw postgresql.org/docs/9.5/file-fdw.html查询CSV 【参考方案1】:我刚刚发现了csvkit,它是一组用于 CSV 文件的 Unix 命令行工具。我用pip install csvkit
将它安装在我的Mac 上。命令是:
csvsql --dialect mysql --snifflimit 100000 bigdatafile.csv > maketable.sql
您也可以提供一个数据库连接字符串,它可以直接加载表。
【讨论】:
这个工具很棒,谢谢!免费,用 Python 制作,并且“正常工作” 在基于 debian 的系统上,您可以通过sudo apt-get install python3-csvkit
安装它
要将 csv 文件直接导入(mysql)数据库,请执行以下操作:csvsql --db mysql://user:password@localhost:3306/dbschema --tables mytable --insert file.csv
(您还必须安装 python3-pymysql)
这个工具非常棒。
我安装了 csvkit,运行 csvsql 命令,但我得到的是“'acsii' codec can't encode character ...”。我使用 python 2.7,ubuntu 14.04。任何人都可以提供一些帮助吗?真的很感激!【参考方案2】:
这是不可能的。要创建表,您需要一个表模式。你所拥有的是一个数据文件。无法使用它创建架构。
您可以做的是检查您的文件是否有标题行,在这种情况下,您可以使用该标题行手动创建表格。
但是,如John Swapceinski in the comment section of the MySQL manual 所述,有一种方法可以使用批处理文件生成创建表语句。
John Swapceinski 于 2011 年 9 月 5 日上午 5:33 发布。 使用 .csv 文件的标题创建表:
#!/bin/sh
# pass in the file name as an argument: ./mktable filename.csv
echo "create table $1 ( "
head -1 $1 | sed -e 's/,/ varchar(255),\n/g'
echo " varchar(255) );"
【讨论】:
该脚本的扩展版本基于 John 在 en.positon.org/post/Import-CSV-file-to-MySQL 上发布的 扩展版还在更新 en.positon.org 和CTRL+F
"将 CSV 文件导入 MySQL"。
我认为这个脚本将所有列创建为VARCHAR(255)
是否正确?如果是这样,那它就不是真的有用了。
你是对的。另请注意 csv 不提供类型信息。所以这里不能使用类型。
一直在寻找这个【参考方案3】:
我建议使用导入数据的 MySQL Workbench。 Workbench 允许用户从 CSV 或 JSON 格式的文件创建新表。只需通过向导单击几下,即可处理表架构和数据导入。
在 MySQL Workbench 中,使用表列表上的上下文菜单并单击 Table Data Import Wizard
。
更多来自 MySQL Workbench 6.5.1 Table Data Export and Import Wizard 文档。 Download MySQL Workbench here.
【讨论】:
请不要只提供链接,而是描述如何解决问题!请参阅how to answer 可能是因为这是 MySQL Workbench 的最新添加,但与之前的所有解决方案相比,这是一种更简单直接的方法。 有没有办法对多个 csv 文件执行此操作? 我的 csv 很大,大约 20 MB,我花了将近 20 分钟将它们导入数据库。在某些时候,我认为它卡住了,因为进度条没有改变。但它最终被导入了一些错误消息。没什么大不了的。【参考方案4】:如果您使用 phpMyAdmin 作为 MySQL 前端,还有一种更简单的方法:
-
使用默认设置创建数据库。
选择数据库。
点击屏幕顶部的“导入”。
在“格式”下选择“CSV”。
选择适合您的 CSV 文件的选项,在文本编辑器中打开 CSV 文件并引用它以获得“适当的”选项。
如果您有问题,没问题,只需删除数据库并重试。
【讨论】:
格式下没有选项可以选择除了csv之外的任何东西 您必须重命名表,但这是最简单的 pma 解决方案。 说它有 2MB 的限制并且不起作用 - 所以基本上没用【参考方案5】:“Convert CSV to SQL”帮助了我。添加您的 CSV 文件,一切顺利。
【讨论】:
正是我需要的。谢谢!【参考方案6】:除了提到的其他解决方案之外,Mac 用户可能还需要注意,SQL Pro 有一个 CSV 导入选项,该选项运行良好且非常灵活 - 您可以在导入时更改列名和字段类型。选择新表,否则初始对话会显得有些令人沮丧。
Sequel Pro - 用于处理 MySQL 数据库的数据库管理应用程序。
【讨论】:
刚刚发现 MySQL Workbench 也可以做到这一点,但是多年来,Sequel Pro 一直是首选,因为它可以很好地处理 CSV->Table。【参考方案7】:如果有人正在寻找 PHP 解决方案,请参阅“PHP_MySQL_wrapper”:
$db = new MySQL_wrapper(MySQL_HOST, MySQL_USER, MySQL_PASS, MySQL_DB);
$db->connect();
// this sample gets column names from first row of file
//$db->createTableFromCSV('test_files/countrylist.csv', 'csv_to_table_test');
// this sample generates column names
$db->createTableFromCSV('test_files/countrylist1.csv', 'csv_to_table_test_no_column_names', ',', '"', '\\', 0, array(), 'generate', '\r\n');
/** Create table from CSV file and imports CSV data to Table with possibility to update rows while import.
* @param string $file - CSV File path
* @param string $table - Table name
* @param string $delimiter - COLUMNS TERMINATED BY (Default: ',')
* @param string $enclosure - OPTIONALLY ENCLOSED BY (Default: '"')
* @param string $escape - ESCAPED BY (Default: '\')
* @param integer $ignore - Number of ignored rows (Default: 1)
* @param array $update - If row fields needed to be updated eg date format or increment (SQL format only @FIELD is variable with content of that field in CSV row) $update = array('SOME_DATE' => 'STR_TO_DATE(@SOME_DATE, "%d/%m/%Y")', 'SOME_INCREMENT' => '@SOME_INCREMENT + 1')
* @param string $getColumnsFrom - Get Columns Names from (file or generate) - this is important if there is update while inserting (Default: file)
* @param string $newLine - New line delimiter (Default: \n)
* @return number of inserted rows or false
*/
// function createTableFromCSV($file, $table, $delimiter = ',', $enclosure = '"', $escape = '\\', $ignore = 1, $update = array(), $getColumnsFrom = 'file', $newLine = '\r\n')
$db->close();
【讨论】:
【参考方案8】:我采用了来自 shiplu.mokadd.im 的脚本来满足我的需要。感兴趣的人:
#!/bin/bash
if [ "$#" -lt 2 ]; then
if [ "$#" -lt 1 ]; then
echo "usage: $0 [path to csv file] <table name> > [sql filename]"
exit 1
fi
TABLENAME=$1
else
TABLENAME=$2
fi
echo "CREATE TABLE $TABLENAME ( "
FIRSTLINE=$(head -1 $1)
# convert lowercase characters to uppercase
FIRSTLINE=$(echo $FIRSTLINE | tr '[:lower:]' '[:upper:]')
# remove spaces
FIRSTLINE=$(echo $FIRSTLINE | sed -e 's/ /_/g')
# add tab char to the beginning of line
FIRSTLINE=$(echo "\t$FIRSTLINE")
# add tabs and newline characters
FIRSTLINE=$(echo $FIRSTLINE | sed -e 's/,/,\\n\\t/g')
# add VARCHAR
FIRSTLINE=$(echo $FIRSTLINE | sed -e 's/,/ VARCHAR(255),/g')
# print out result
echo -e $FIRSTLINE" VARCHAR(255));"
【讨论】:
【参考方案9】:你可以使用这个 bash 脚本
convert.sh
然后运行
./convert.sh -f example/mycsvfile.csv
【讨论】:
【参考方案10】:这是不可能的,但是您可以覆盖现有的表格文件。但请确保文件中的行结尾是 unix 样式(仅以 \n 结尾),而不是 windows 样式(以 \r\n 结尾),无论您是否在 windows 下工作。
【讨论】:
【参考方案11】:如果您可以使用 Python,Pandas 对我来说非常有用(我的情况下 csvsql 永远挂了)。比如:
from sqlalchemy import create_engine
import pandas as pd
df = pd.read_csv('/PATH/TO/FILE.csv')
# Optional, set your indexes to get Primary Keys
df = df.set_index(['COL A', 'COL B'])
engine = create_engine('mysql://user:pass@host/db', echo=False)
df.to_sql(table_name, dwh_engine, index=False)
这也不能解决问题中的“使用 CSV 引擎”部分,但也可能对我有用。
【讨论】:
【参考方案12】:我已经制作了一个 Windows 命令行工具来执行此操作。
你可以在这里下载:http://commandline.dk/csv2ddl.htm
用法:
C:\Temp>csv2ddl.exe mysql test.csv test.sql
或者
C:\Temp>csv2ddl.exe mysql advanced doublequote comma test.csv test.sql
【讨论】:
现在,对于我们这些可怜的 Windows 用户来说,这看起来很酷。不幸的是,该链接不再起作用;(【参考方案13】:MySQL for excel 插件可以帮助你。
http://dev.mysql.com/doc/refman/5.6/en/mysql-for-excel.html
在 Excel 中打开您的 CSV 文件。您可以使用此插件将 excel 数据导出到远程或本地 mysql 服务器的新表中。 它将分析您的数据(前 100 到 1000 行)并创建相应的表架构。
【讨论】:
哇。这个工具简直太棒了。我必须创建一个包含 99 个字段和 1100 行的表。这个工具做了一些基本的数据验证,并为我创建了表格和所有字段。做得很好。我能够远程连接到 GoDaddy MySQL 表。注意:此工具仅适用于 windows 操作系统。 链接已损坏。以上是关于使用 CSV 存储引擎直接从 CSV 文件创建 mysql 表?的主要内容,如果未能解决你的问题,请参考以下文章