使用 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 表?的主要内容,如果未能解决你的问题,请参考以下文章

除Innodb和MyISAM外MySQL所支持的存储引擎

将csv数据直接写入节点js中的azure blob

从 NSMutableArray 创建一个 csv

直接从服务器将 csv 文件上传到 aws s3 存储桶

从多个 csv 文件创建 libsvm 用于 xgboost 外部内存训练

将 csv 文件从云存储批量加载到 bigquery