Créer une table mysql directement à partir du fichier CSV en utilisant le moteur de stockage CSV?

Je viens d'apprendre que Mysql a un moteur de stockage CSV natif {[2] } qui stocke les données dans un fichier de valeurs séparées par des virgules par table.

Est-il possible de créer une table directement à partir d'un fichier CSV téléchargé, quelque chose comme:

CRÉER DES UTILISATEURS DE TABLE

Où les utilisateurs.csv est téléchargé par l'utilisateur?

47
demandé sur Jonathan 2012-04-03 21:46:38

12 réponses

Ce n'est pas possible. Pour créer une table, vous avez besoin d'un schéma de table. Ce que vous avez est un fichier de données. Le schéma ne peut pas être créé avec lui. Ce que vous pouvez faire est de vérifier si votre fichier a une ligne d'en-tête. Dans ce cas, vous pouvez créer une table en utilisant cette ligne d'en-tête mais manuellement.

Cependant, il existe un moyen de générer une instruction create table par un fichier batch comme décrit par John Swapceinski dans la section commentaire du manuel MySQL .

Posté par John Swapceinski le septembre 5 2011 5:33am.
Créer une table en utilisant le .en-tête du fichier 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) );"
36
répondu Shiplu Mokaddim 2013-05-01 13:13:52

Vient de découvrir csvkit , qui est un ensemble d'outils de ligne de commande unix pour les fichiers CSV. Installé sur mon Mac avec pip install csvkit et la commande était:

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

Vous pouvez également fournir une chaîne de connexion db et charger la table directement.

71
répondu prototype 2014-05-08 03:22:11

Je sais que c'est un peu périmé en tant que sujet, mais il y a un moyen plus facile-si-vous utilisez phpmyadmin comme frontal mysql.

1) créez une base de données avec seulement les paramètres par défaut.

2) Sélectionnez la base de données.

3)Cliquez sur "Importer" en haut de l'écran.

4) sélectionnez CSV sous "Format".

5) Choisissez les options appropriées à votre fichier csv (ouvrez le fichier csv dans un éditeur de texte et référencez-le pour obtenir des options "appropriées").

Si vous muck It up, pas de problème, il suffit de déposer la base de données et essayez à nouveau.

9
répondu Bill Isaacs 2013-12-31 01:10:19

C'est ce qui m'a aidé. Ajoutez simplement votre fichier csv et vous êtes prêt à partir.

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

6
répondu pal4life 2014-07-01 05:55:42

Il est recommandé d'utiliser MySQL Workbench où sont les données d'importation. Workbench permet à l'utilisateur de créer une nouvelle table à partir d'un fichier au format CSV ou JSON. Il gère le schéma de table et l'importation de données en quelques clics via l'Assistant.

Dans MySQL Workbench, utilisez le menu contextuel de la liste des tables et cliquez sur Table Data Import Wizard.

MySQL Workbench image

Plus de la Documentation de MySQL Workbench 6.5.1 Table Data Export and Import Wizard . téléchargez MySQL Workbench ici.

6
répondu Jan Damek 2018-06-19 20:48:21

En plus des autres solutions mentionnées, les utilisateurs de Mac peuvent noter que SQL Pro a une option D'importation CSV qui fonctionne assez bien et est flexible - vous pouvez changer les noms de colonnes et les types de champs à l'importation. Choisissez une nouvelle table sinon le dialogue initial peut sembler quelque peu décourageant.

SQL Pro: http://www.sequelpro.com Sequel Pro-application de gestion de base de données pour travailler avec des bases de données MySQL

5
répondu Tim Green 2015-01-02 21:53:42

Si quelqu'un cherche PHP solutin:

Paquet: 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();
2
répondu rjanjic 2014-05-15 21:57:09

J'ai adopté le script de shiplu.mokadd.im pour répondre à mes besoins. Qui il intéresse:

#!/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));"
2
répondu Johann Horvat 2015-09-04 08:22:39

J'ai fait un outil de ligne de commande Windows qui fait exactement cela.

Vous pouvez le télécharger ici: http://commandline.dk/csv2ddl.htm

Utilisation:

C:\Temp>csv2ddl.exe mysql test.csv test.sql

Ou

C:\Temp>csv2ddl.exe mysql advanced doublequote comma test.csv test.sql
1
répondu Jacob 2014-04-04 18:45:39

MySQL pour excel plugin peut vous aider.

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

Ouvrez votre fichier CSV dans excel. Vous pouvez utiliser ce plugin pour exporter des données excel dans une nouvelle table de serveur mysql distant ou local. Il analysera vos données (100 à 1000 lignes) et créera un schéma de table correspondant.

1
répondu Ian Chang 2014-08-07 16:02:43

Ce n'est pas possible, vous pouvez cependant écraser un fichier de table existant. Mais assurez-vous que les fins de ligne dans votre fichier sont de style unix (se terminant uniquement par \n), pas de style windows (se terminant par \r\n), que vous travailliez sous windows ou non.

0
répondu fancyPants 2012-04-03 18:12:18

Si vous êtes d'accord avec l'utilisation de Python, les Pandas ont très bien fonctionné pour moi (csvsql pendu pour toujours pour mon cas). Quelque chose comme:

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)

Cela ne résout pas non plus la partie "Utilisation du moteur CSV" qui faisait partie de la question mais pourrait aussi m'être utile.

0
répondu ivansabik 2017-03-28 04:21:01