我刚刚了解到Mysql有一个Native CSV storage engine,它将数据存储在每个表的逗号分隔值文件中。
是否可以直接从上传的CSV文件创建表格,如:
创建表用户< PATH / USERS.CSV
用户上传users.csv?
答案 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 6.5.1 Table Data Export and Import Wizard文档。 Download MySQL Workbench here
答案 4 :(得分:6)
这对我有所帮助。只需添加你的csv文件就可以了。
答案 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)
答案 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引擎”部分,这部分是问题的一部分,但也可能对我有用。