使用CSV存储引擎直接从CSV文件创buildmysql表?
我刚刚了解到,Mysql有一个本机CSV存储引擎 ,它将数据存储在每个表的逗号分隔值文件中。
是否可以直接从上传的CSV文件创build表格,如下所示:
创build表用户<PATH / USERS.CSV
users.csv是由用户上传的?
这不可能。 要创build表,你需要一个表模式。 你有什么是一个数据文件。 架构不能用它来创build。 你可以做的是检查你的文件是否有标题行。 在这种情况下,您可以使用该标题行手动创build表格。
但是,有一种方法可以通过batch file生成create table语句,如John Swapceinski在MySQL手册的注释部分所述 。
发贴者John Swapceinski时间:2011年9月5日上午5:33
使用.csv文件的标题创build一个表格:
#!/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) );"
刚刚发现了csvkit ,这是一组用于CSV文件的unix命令行工具。 在我的Mac上pip install csvkit
了pip install csvkit
,命令是:
csvsql --dialect mysql --snifflimit 100000 bigdatafile.csv > maketable.sql
您也可以提供一个数据库连接string,它可以直接加载表。
我知道这是一个有点陈旧的主题,但有一个更简单的方法 – 如果你使用phpmyadmin作为你的mysql前端。
1)创build一个只有默认设置的数据库。
2)select数据库。
3)点击屏幕顶部的“导入”。
4)在“格式”下selectCSV。
5)select适合您csv文件的选项(在文本编辑器中打开csv文件并引用它以获得“适当的”选项)。
如果你把它搞糊涂了,没问题,只要放下数据库然后再试一次。
除了上面提到的其他解决scheme之外,Mac用户可能还要注意,SQL Pro有一个CSV导入选项,工作得很好,而且很灵活 – 您可以在导入时更改列名和字段types。 select新表,否则最初的对话可能会显得有些沮丧。
SQL Pro: http : //www.sequelpro.com Sequel Pro – 用于处理MySQL数据库的数据库pipe理应用程序
这是对我的帮助。 只需添加您的CSV文件,你就可以走了。
如果有人正在寻找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();
我采用了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));"
我build议使用MySQL Workbench,其中是导入数据。 还可以从CSV或JSON中创build新表。
在MySQL Workbench应用程序中使用表列表中的上下文菜单并使用
表数据导入向导
MySQL工作台图像
Link for MySQL Workbench。 https://dev.mysql.com/doc/workbench/en/wb-admin-export-import-table.html
我已经做了一个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
MySQL的Excel插件可以帮助你。
http://dev.mysql.com/doc/refman/5.6/en/mysql-for-excel.html
在Excel中打开您的CSV文件。 你可以使用这个插件将excel数据导出到远程或本地mysql服务器的新表中。 它会分析你的数据(从前100到1000行),并创build一个相应的表模式。
这是不可能的,但是可以覆盖现有的表格文件。 但可以肯定的是,文件中的行结尾是unix风格(只以\ n结尾),而不是windows风格(以\ r \ n结尾),无论您是否在windows下工作。
如果你用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引擎”的一部分,但也可能有用。