使用CSV存储引擎直接从CSV文件创建mysql表?

时间:2012-04-03 17:46:38

标签: mysql database csv storage-engines

我刚刚了解到Mysql有一个Native CSV storage engine,它将数据存储在每个表的逗号分隔值文件中。

是否可以直接从上传的CSV文件创建表格,如:

创建表用户< PATH / USERS.CSV

用户上传users.csv?

13 个答案:

答案 0 :(得分:82)

刚刚发现csvkit,这是一组用于CSV文件的unix命令行工具。使用pip install csvkit安装在我的Mac上,命令为:

 csvsql --dialect mysql --snifflimit 100000 bigdatafile.csv > maketable.sql

您也可以提供数据库连接字符串,它可以直接加载表。

答案 1 :(得分:38)

这是不可能的。要创建表,您需要一个表模式。你拥有的是一个数据文件。无法使用它创建架构。你可以做的是检查你的文件是否有标题行。在这种情况下,您可以使用该标题行创建表,但需要手动创建。

但是有一种方法可以按批处理文件生成create table语句,如John Swapceinski in the comment section of 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) );"

答案 2 :(得分:9)

我知道这是一个有点陈旧的主题,但有一种更简单的方法 - 如果 - 你使用phpmyadmin作为你的mysql前端。

1)使用默认设置创建数据库。

2)选择数据库。

3)点击屏幕顶部的“导入”。

4)在“格式”下选择CSV。

5)选择适合您的csv文件的选项(在文本编辑器中打开csv文件并引用它以获得'适当'选项)。

如果你搞砸了,没问题,只需丢弃数据库然后重试。

答案 3 :(得分:8)

我建议使用MySQL Workbench导入数据。 Workbench允许用户以CSV或JSON格式从文件创建新表。它只需通过向导点击几下即可处理表模式和数据导入。

在MySQL Workbench中,使用表格列表中的上下文菜单,然后单击Table Data Import Wizard

MySQL Workbench image

更多来自MySQL Workbench 6.5.1 Table Data Export and Import Wizard文档。 Download MySQL Workbench here

答案 4 :(得分:6)

这对我有所帮助。只需添加你的csv文件就可以了。

http://www.convertcsv.com/csv-to-sql.htm

答案 5 :(得分:6)

除了提到的其他解决方案之外,Mac用户可能还需要注意,SQL Pro具有CSV导入选项,该选项运行良好且灵活 - 您可以在导入时更改列名和字段类型。选择新表,否则初始对话可能会显得有点令人沮丧。

SQL专业版:http://www.sequelpro.com Sequel Pro - 用于处理MySQL数据库的数据库管理应用程序

答案 6 :(得分:2)

如果有人在寻找php solutin:

套餐:https://github.com/uzi88/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();

答案 7 :(得分:2)

我采用了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));"

答案 8 :(得分:2)

您可以使用此bash脚本

convert.sh

然后运行

./convert.sh -f example/mycsvfile.csv

答案 9 :(得分:1)

我已经制作了一个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

答案 10 :(得分:1)

MySQL for excel插件可以帮到你。

http://dev.mysql.com/doc/refman/5.6/en/mysql-for-excel.html

在Excel中打开您的CSV文件。您可以使用此插件将Excel数据导出到远程或本地mysql服务器的新表中。 它将分析您的数据(前100到1000行)并创建相应的表模式。

答案 11 :(得分:0)

这是不可能的,但您可以覆盖现有的表文件。但请确保,您的文件中的行结尾是unix样式(仅以\ n结尾),而不是Windows样式(以\ r \ n结尾),无论您是否在Windows下工作。

答案 12 :(得分:0)

如果您对使用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引擎”部分,这部分是问题的一部分,但也可能对我有用。