70

我刚刚了解到 MySQL 有一个本机CSV 存储引擎,它将数据存储在每个表的逗号分隔值文件中。

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

CREATE TABLE USERS < PATH/USERS.CSV

用户在哪里users.csv上传?

4

13 回答 13

104

我刚刚发现了csvkit,它是一组用于 CSV 文件的 Unix 命令行工具。我用pip install csvkit. 命令是:

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

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

于 2014-05-08T03:22:11.013 回答
45

这是不可能的。要创建表,您需要一个表模式。你所拥有的是一个数据文件。无法使用它创建架构。

您可以做的是检查您的文件是否有标题行,在这种情况下,您可以使用该标题行手动创建表格。

但是,有一种使用批处理文件生成创建表语句的方法,如MySQL 手册的注释部分中的 John Swapceinski 所述

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) );"
于 2012-04-03T17:56:10.310 回答
25

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

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

MySQL 工作台映像

更多来自 MySQL Workbench 6.5.1 表数据导出和导入向导文档。在此处下载 MySQL Workbench

于 2017-01-12T11:29:51.653 回答
10

如果您使用 phpMyAdmin 作为 MySQL 前端,则有一种更简单的方法:

  1. 使用默认设置创建数据库。
  2. 选择数据库。
  3. 单击屏幕顶部的“导入”。
  4. 在“格式”下选择“CSV”。
  5. 选择适合您的 CSV 文件的选项,在文本编辑器中打开 CSV 文件并引用它以获得“适当的”选项。

如果您有问题,没问题,只需删除数据库并重试。

于 2013-12-31T01:10:19.997 回答
10

将 CSV 转换为 SQL ”帮助了我。添加您的 CSV 文件,一切顺利。

于 2014-07-01T05:55:42.110 回答
7

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

Sequel Pro - 用于处理 MySQL 数据库的数据库管理应用程序。

于 2015-01-02T21:53:42.607 回答
4

如果有人正在寻找 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();
于 2014-05-15T21:57:09.233 回答
2

你可以使用这个 bash 脚本

转换.sh

并运行

./convert.sh -f example/mycsvfile.csv
于 2020-08-01T21:26:07.460 回答
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));"
于 2015-09-04T08:22:39.010 回答
1

This is not possible, you can however overwrite an existing table file. But be sure, that the line endings in your file are unix style (ending only with \n), not windows style (ending with \r\n), whether you are working under windows or not.

于 2012-04-03T18:12:18.430 回答
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
于 2014-04-04T18:45:39.650 回答
1

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

于 2017-03-28T04:21:01.357 回答
0

MySQL for excel 插件可以帮助你。

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

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

于 2014-08-07T16:02:43.117 回答