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?
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) );"
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.
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.
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
.
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 .
C'est ce qui m'a aidé. Ajoutez simplement votre fichier csv et vous êtes prêt à partir.
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
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();
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));"
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.
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
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.
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.