web-dev-qa-db-fra.com

Créer une table mysql directement à partir d'un fichier CSV à l'aide du moteur de stockage CSV?

Je viens d'apprendre que Mysql possède un moteur de stockage Native CSV qui stocke des 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 <PATH/USERS.CSV

où users.csv est téléchargé par l'utilisateur?

49
Jonathan

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 ce dernier. Ce que vous pouvez faire, c'est vérifier si votre fichier a une ligne d'en-tête. Dans ce cas, vous pouvez créer un tableau à l'aide de 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 .

Publié par John Swapceinski le 5 septembre 2011 5:33.
Créez une table en utilisant l'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) );"
38
Shiplu Mokaddim

Je viens 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 la suivante:

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

Vous pouvez également fournir une chaîne de connexion à la base de données et charger directement la table.

79
prototype

Je sais que ce sujet est un peu obsolète, mais il existe un moyen plus simple - SI - vous utilisez phpmyadmin comme frontal mysql. 

1) Créez une base de données avec juste 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 correspondant à votre fichier csv (ouvrez le fichier csv dans un éditeur de texte et faites-le référence pour obtenir les options «appropriées»).

Si vous échouez, pas de problème, supprimez simplement la base de données et réessayez.

9
Bill Isaacs

Je vous recommande d'utiliser MySQL Workbench où sont importées les données. 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 la table et l'importation des données en quelques clics grâce à 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 d'informations sur MySQL Workbench 6.5.1 Exportation et importation de données de table Wizard documentation. Téléchargez MySQL Workbench ici .

7
Jan Damek

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
pal4life

En plus des autres solutions mentionnées, les utilisateurs de Mac voudront peut-être noter que SQL Pro dispose d'une option d'importation au format CSV qui fonctionne assez bien et qui est flexible: vous pouvez modifier les noms de colonne et les types de champs à l'importation. Choisissez une nouvelle table, sinon le dialogue initial peut paraître quelque peu décourageant.

SQL Pro: http://www.sequelpro.com Sequel Pro - application de gestion de base de données permettant d’utiliser des bases de données MySQL 

5
Tim Green

si quelqu'un cherche php solutin:

Package: 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
rjanjic

J'ai adopté le script de shiplu.mokadd.im pour répondre à mes besoins. Qui cela 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
Johann Horvat

Le plugin MySQL pour Excel 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 du serveur mysql local ou distant . Il analysera vos données (100 à 1000 lignes supérieures) et créera un schéma de table correspondant.

1
Ian Chang

J'ai créé un outil de ligne de commande Windows qui fait justement cela. 

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

Usage:

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

Ou

C:\Temp>csv2ddl.exe mysql advanced doublequote comma test.csv test.sql
1
Jacob

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

0
fancyPants

Si vous êtes d'accord avec l'utilisation de Python, les Pandas ont très bien fonctionné pour moi (csvsql a été suspendu pour toujours dans 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)

De plus, cela ne résout pas la partie "utilisation du moteur CSV" qui faisait partie de la question, mais qui pourrait également m'être utile.

0
ivansabik