IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Load data avec une variable pour nom de fichier


Sujet :

SQL Procédural MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5
    Points : 7
    Points
    7
    Par défaut Load data avec une variable pour nom de fichier
    Bonjour à tous,

    Après d'infructueuses recherches sur le net et sur le forum, j'aimerai savoir s'il existe une astuce pour utiliser une variable à la place du nom de fichier dans la commande "load data"

    Le tout dans une procédure stockée

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [...]
    set vaexecuter='c:/import/software_application2.csv';
    
    load data local infile vaexecuter
    into table `import_software_application`
    fields terminated by ';'
    lines terminated by '\r\n';
    [...]
    Merci a tous ceux qui prendrons le temps m'aider.

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 43
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par kelk1 Voir le message
    Bonjour à tous,

    Après d'infructueuses recherches sur le net et sur le forum, j'aimerai savoir s'il existe une astuce pour utiliser une variable à la place du nom de fichier dans la commande "load data"

    Le tout dans une procédure stockée

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [...]
    set vaexecuter='c:/import/software_application2.csv';
    
    load data local infile vaexecuter
    into table `import_software_application`
    fields terminated by ';'
    lines terminated by '\r\n';
    [...]
    Merci a tous ceux qui prendrons le temps m'aider.
    Bonjour Kelk, je suis dans la même situation que vous, avez vous trouvez une solution ?????

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut à tous.

    Pour résoudre votre problème, j'ai pensé à utiliser une requête préparée. Mais le "load data local infile" est refusée par mysql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1295 (HY000) at line 50: This command is not supported in the prepared statement protocol yet
    J'ai pensé aussi à mettre une variable @file, mais cela ne passe pas non plus.
    De plus, une demande a déjà été faire, mais sans succès jusqu'à présent : http://bugs.mysql.com/bug.php?id=39115

    The LOAD DATA INFILE statement reads rows from a text file into a table at a very high speed. The file name must be given as a literal string.
    On ne peut pas mettre un nom variable car dans le "load data local infile", le '@file' sera considéré comme un nom de fichier.
    Autrement dit, MySql n'accepte qu'un littéral et non une variable.

    Donc impossible de trouver une solution directement en passant par MySql.

    Il existe pourtant deux solutions à ce genre de problème :

    1) soit encapsuler le "load data local infile" dans une chaîne de caractères et faire la substitution dans un langage comme php, par exemple.
    Cette solution fonctionne parfaitement. Pourquoi ?
    Dans le langage php, la commande est considérée comme une chaîne de caractères !
    Tandis que sous MySql, cette chaîne de caractères devient une commande et est interprétée.

    2) utilise l'outil MySql de nom "mysqlimport".
    Dans cet exemple, j'ai créé un fichier batch sous windows.
    Vous pouvez dupliquer cette ligne (mysqlimport) autant de fois que vous avez des fichiers '.csv' à charger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @echo off
     
    chcp 65001 > nul
     
    set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH%
     
    mysqlimport  --verbose  --force  --delete  --fields-optionally-enclosed-by=\"  --fields-terminated-by=,  --fields-escaped-by=\\  --lines-terminated-by=\r\n  --local  base  test.csv
    @echo.
    pause
    exit
    Pour répondre à la question, dans une procédure stockée, il n'est pas possible de rendre variable le nom du fichier à charger dans votre table, à cause de la requête préparée (execute prepare from "load data infile ...") qui ne supporte pas cette commande.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 43
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut à tous.

    Pour résoudre votre problème, j'ai pensé à utiliser une requête préparée. Mais le "load data local infile" est refusée par mysql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1295 (HY000) at line 50: This command is not supported in the prepared statement protocol yet
    J'ai pensé aussi à mettre une variable @file, mais cela ne passe pas non plus.
    De plus, une demande a déjà été faire, mais sans succès jusqu'à présent : http://bugs.mysql.com/bug.php?id=39115


    On ne peut pas mettre un nom variable car dans le "load data local infile", le '@file' sera considéré comme un nom de fichier.
    Autrement dit, MySql n'accepte qu'un littéral et non une variable.

    Donc impossible de trouver une solution directement en passant par MySql.

    Il existe pourtant deux solutions à ce genre de problème :

    1) soit encapsuler le "load data local infile" dans une chaîne de caractères et faire la substitution dans un langage comme php, par exemple.
    Cette solution fonctionne parfaitement. Pourquoi ?
    Dans le langage php, la commande est considérée comme une chaîne de caractères !
    Tandis que sous MySql, cette chaîne de caractères devient une commande et est interprétée.

    2) utilise l'outil MySql de nom "mysqlimport".
    Dans cet exemple, j'ai créé un fichier batch sous windows.
    Vous pouvez dupliquer cette ligne (mysqlimport) autant de fois que vous avez des fichiers '.csv' à charger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @echo off
     
    chcp 65001 > nul
     
    set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH%
     
    mysqlimport  --verbose  --force  --delete  --fields-optionally-enclosed-by=\"  --fields-terminated-by=,  --fields-escaped-by=\\  --lines-terminated-by=\r\n  --local  base  test.csv
    @echo.
    pause
    exit
    Pour répondre à la question, dans une procédure stockée, il n'est pas possible de rendre variable le nom du fichier à charger dans votre table, à cause de la requête préparée (execute prepare from "load data infile ...") qui ne supporte pas cette commande.

    @+
    merci pour votre réponse rapide .
    En faite j'ai essayé votre code mais ca m'affiche ce message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'mysqlimport' n’est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.
     
    Appuyez sur une touche pour continuer...
    En faite je suis en stage et il m'a était demandé de crée une base de donnée et de la charger avec des fichiers csv(500 fichiers)
    le problème et que j'arrive pas a importer les fichiers via l'interface phpmyadmin parce qu'il y a une clé étrangère dans la table T2.
    Ma base contient que 2 Table (T2 et T1). j'ai tenté plusieurs chose mais j'arrive pas et je tourne en rond.
    Normalement toute mais fichier doivent être importer dans la table T2 voila mon MCD Nom : mcd.png
Affichages : 984
Taille : 12,6 Ko

    Après pour insérer les csv j'ai pas vraiment trouvé la piste, un fichier csv contient 20 champ et moi j'ai rajouté id facture et la clé étranger et la date venant de l'association porteuse, ca fait 3 semaines que je tourne en boucle. j'ai commencé a lire vos tutos sur le site peut être je tombe sur un début de fil .

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut lefi0528.

    Citation Envoyé par lefi0528
    j'ai essayé votre code mais ca m'affiche ce message
    Le minimum à faire est de réadapter mon code à vos besoin.

    C'est un script batch windows qui permet de lancer la commande "mysqlimport". La ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH%
    est pour indiquer où se trouve le répertoire bin de mysql. Comme j'ai plusieurs MySql sur mon ordinateur, je précise le chemin vers l'un d'eux.

    Admettons que vous avez installé votre WampServer sur une machine windows, dans le répertoire "C:\Wamp".
    De plus, vous utilisez la version MySql 5.6.28. La commande path s'écrit comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set PATH=.;C:\Wamp\bin\mysql\mysql5.6.28\bin\;%PATH%
    Citation Envoyé par lefi0528
    En faite je suis en stage et il m'a était demandé de crée une base de donnée et de la charger avec des fichiers csv (500 fichiers)
    500 fichiers, cela signifie 500 tables ? C'est pas un peu beaucoup ?

    Citation Envoyé par lefi0528
    le problème et que j'arrive pas a importer les fichiers via l'interface phpmyadmin parce qu'il y a une clé étrangère dans la table T2.
    Pour résoudre votre problème, vous devez charger vos tables dans un ordre prédéfini à l'avance.

    Soit la table t1 et la table t2. Il y a une clef étrangère dans la table t2 qui pointe vers la table t1.
    Et bien, vous devez d'abord charger la table t1 avant la table t2. Pourquoi ?
    Car la clef étrangère indique que vous avez un contrôle d'intégrité dans la table qui spécifie sur la colonne, la clef étrangère.

    Si votre table t1 est "client" et table t2 est "facture", vous devez charger en premier la table t1 "client" avant la table t2 "facture".

    Il se peut que vous fassiez les choses correctement, mais il se peut aussi que votre table t1 "client" ne contienne pas les identifiants qui sont en clef étrangère dans la table t2 "facture".
    Autrement dit, vous avez un problème d'intégrité avec cette clef étrangère.
    Soit vous n'avez pas le bon fichier '.csv' "client", soit la table t1 "client" est vide.

    Citation Envoyé par lefi0528
    Après pour insérer les csv j'ai pas vraiment trouvé la piste, un fichier csv contient 20 champ et moi j'ai rajouté id facture et la clé étranger et la date venant de l'association porteuse, ca fait 3 semaines que je tourne en boucle. j'ai commencé a lire vos tutos sur le site peut être je tombe sur un début de fil.
    Quand on ne sait pas prendre le problème, on commence par faire un exercice basique. Ensuite, on va complexifier l'exercice pour arriver à résoudre le problème.

    Tu as un fichier de type "text", dont le préfixe est ".csv".

    1) il faut vérifier que tu utilises le bon jeu de caractères.
    Ceci est fréquement source de problèmes pour un chargement.
    Vérifier que ta table MySql est bien en "utf8". Dans l'exemple que je te donne (un peu plus loin), j'utilise "latin1".
    Ce qui implique que tes fichier '.csv' sont aussi dans ce même jeu de caractères.

    2) en jettant un coup d'oeil dans le fichier, il faut s'assurer qu'il est correctement formaté.
    a) les chaines de caractères sont entre guillemets (").

    b) les nombres ne sont pas encadrés pas des guillemets.

    c) chaque champs de ton fichier ".csv" est séparé par une virgule (,).

    d) comme tu es sous windows, la marque de fin de la ligne est codifié "/r/n".
    --> "/r" signifie "carriage return" ou en français retour charriot.
    --> "/n" signifie "new line" ou nouvelle ligne.

    e) en espérant que tu n'as pas de caractères spéciaux, il faut savoir qu'ils sont préfixés par un anti-slash (\).

    3) il se peut aussi que dans ton fichier '.csv', il y a des entêtes à ne pas charger. Et bien, il faut les ignorer charger.

    4) définir entre parenthèse () les champs que vous allez charger dans votre table.
    Il se peut que vous soyez obliger de faire un petit traitement, comme par exemple supprimer les blancs avant et après de la chaîne.
    Ou encore reformater les dates pour quelles soient compréhensible par MySql.

    Voici un script MySql qui charge une toute petite table. En fait, c'est un exercice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS Cities
    --------------
     
    --------------
    CREATE TABLE Cities (
        Country     CHAR(2),
        City        CHAR(22),
        AccentCity  CHAR(3),
        Region      CHAR(2),
        Population  INT UNSIGNED NULL DEFAULT NULL,
        Latitude    FLOAT,
        Longitude   FLOAT,
            Date        DATETIME
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    TRUNCATE Cities
    --------------
     
    --------------
    set unique_checks      = 0
    --------------
     
    --------------
    set foreign_key_checks = 0
    --------------
     
    --------------
    set sql_log_bin        = 0
    --------------
     
    --------------
    alter table Cities DISABLE KEYS
    --------------
     
    --------------
    commit
    --------------
     
    --------------
    LOAD DATA LOCAL INFILE 'fichier.txt'
         INTO TABLE `Cities`
         CHARACTER SET latin1
         FIELDS TERMINATED BY ','
         ENCLOSED BY '"'
         ESCAPED BY '\\' LINES
         TERMINATED BY '\r\n'
         IGNORE 0 LINES
         (@F1, @F2, @F3, @F4, Population, Latitude, Longitude, @F8)
         set Country = trim(@F1),
                City = trim(@F2),
          AccentCity = trim(@F3),
              Region = trim(@F4),
                Date = outils.chgdate(@F8)
    --------------
     
    --------------
    commit
    --------------
     
    --------------
    alter table Cities ENABLE KEYS
    --------------
     
    --------------
    set unique_checks      = 1
    --------------
     
    --------------
    set foreign_key_checks = 1
    --------------
     
    --------------
    set sql_log_bin        = 1
    --------------
     
    --------------
    commit
    --------------
     
    --------------
    select  concat('>', Country,   '<') as 'Country',
                    concat('>', City,      '<') as 'City',
                    concat('>', AccentCity,'<') as 'AccentCity',
                    concat('>', Region,    '<') as 'Region',
                    concat('>', Population,'<') as 'Population',
                    concat('>', Latitude,  '<') as 'Latitude',
                    concat('>', Longitude, '<') as 'Longitude',
                    concat('>', date,      '<') as 'Date'
    from `Cities`
    --------------
     
    +---------+-----------------------+------------+--------+------------+----------+-----------+-----------------------+
    | Country | City                  | AccentCity | Region | Population | Latitude | Longitude | Date                  |
    +---------+-----------------------+------------+--------+------------+----------+-----------+-----------------------+
    | >fr<    | >dijon bourgogne<     | >---<      | >bo<   | >500000<   | >200<    | >150<     | >2015-12-10 15:20:00< |
    | >fr<    | >paris ile de france< | >---<      | >il<   | >2000000<  | >100<    | >50<      | >2015-06-15 07:15:00< |
    | >fr<    | >nice paca<           | >---<      | >pa<   | >100000<   | >250<    | >75<      | >2015-07-25 19:58:00< |
    | >fr<    | >paca<                | >---<      | >pa<   | >100000<   | >250<    | >75<      | >2015-07-25 19:58:00< |
    +---------+-----------------------+------------+--------+------------+----------+-----------+-----------------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Et voici le fichier à charger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "fr","dijon bourgogne","---","bo",500000,200,150,"10/12/2015 15:20"
    "fr","paris ile de france","---","il",2000000,100,50,"15/06/2015 07:15"
    "fr","nice paca","---","pa",100000,250,75,"25/07/2015 19:58"
    "fr","paca","---","pa",100000,250,75,"25/07/2015 19:58"
    Et pout terminer, mon batch windows qui permet de lancer ce script MySql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @echo off
     
    setlocal enableDelayedExpansion
     
    chcp 1252 > nul
     
    set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH%
     
    SET FIC=%~nx0
    SET FIC=%FIC:bat=sql%
     
    mysql < %FIC%  --verbose  --force
    @echo.
    pause
    exit
    L'exemple avec l'utilitaire MySqlImport ne vous sert à rien, car comme je le suppose, vous ne devez pas charger toutes les colonnes.
    Et pire, vous avez sûrement un formatage à faire sur ces colonnes.
    Inspirez vous de mon exemple. Commencez par un petit jeu d'essai afin de comprendre comment procéder.

    Si vous avez des questions, n'hésitez pas, je reste à votre disposition !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 43
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut lefi0528.


    Le minimum à faire est de réadapter mon code à vos besoin.

    C'est un script batch windows qui permet de lancer la commande "mysqlimport". La ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH%
    est pour indiquer où se trouve le répertoire bin de mysql. Comme j'ai plusieurs MySql sur mon ordinateur, je précise le chemin vers l'un d'eux.

    Admettons que vous avez installé votre WampServer sur une machine windows, dans le répertoire "C:\Wamp".
    De plus, vous utilisez la version MySql 5.6.28. La commande path s'écrit comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set PATH=.;C:\Wamp\bin\mysql\mysql5.6.28\bin\;%PATH%

    500 fichiers, cela signifie 500 tables ? C'est pas un peu beaucoup ?


    Pour résoudre votre problème, vous devez charger vos tables dans un ordre prédéfini à l'avance.

    Soit la table t1 et la table t2. Il y a une clef étrangère dans la table t2 qui pointe vers la table t1.
    Et bien, vous devez d'abord charger la table t1 avant la table t2. Pourquoi ?
    Car la clef étrangère indique que vous avez un contrôle d'intégrité dans la table qui spécifie sur la colonne, la clef étrangère.

    Si votre table t1 est "client" et table t2 est "facture", vous devez charger en premier la table t1 "client" avant la table t2 "facture".

    Il se peut que vous fassiez les choses correctement, mais il se peut aussi que votre table t1 "client" ne contienne pas les identifiants qui sont en clef étrangère dans la table t2 "facture".
    Autrement dit, vous avez un problème d'intégrité avec cette clef étrangère.
    Soit vous n'avez pas le bon fichier '.csv' "client", soit la table t1 "client" est vide.


    Quand on ne sait pas prendre le problème, on commence par faire un exercice basique. Ensuite, on va complexifier l'exercice pour arriver à résoudre le problème.

    Tu as un fichier de type "text", dont le préfixe est ".csv".

    1) il faut vérifier que tu utilises le bon jeu de caractères.
    Ceci est fréquement source de problèmes pour un chargement.
    Vérifier que ta table MySql est bien en "utf8". Dans l'exemple que je te donne (un peu plus loin), j'utilise "latin1".
    Ce qui implique que tes fichier '.csv' sont aussi dans ce même jeu de caractères.

    2) en jettant un coup d'oeil dans le fichier, il faut s'assurer qu'il est correctement formaté.
    a) les chaines de caractères sont entre guillemets (").

    b) les nombres ne sont pas encadrés pas des guillemets.

    c) chaque champs de ton fichier ".csv" est séparé par une virgule (,).

    d) comme tu es sous windows, la marque de fin de la ligne est codifié "/r/n".
    --> "/r" signifie "carriage return" ou en français retour charriot.
    --> "/n" signifie "new line" ou nouvelle ligne.

    e) en espérant que tu n'as pas de caractères spéciaux, il faut savoir qu'ils sont préfixés par un anti-slash (\).

    3) il se peut aussi que dans ton fichier '.csv', il y a des entêtes à ne pas charger. Et bien, il faut les ignorer charger.

    4) définir entre parenthèse () les champs que vous allez charger dans votre table.
    Il se peut que vous soyez obliger de faire un petit traitement, comme par exemple supprimer les blancs avant et après de la chaîne.
    Ou encore reformater les dates pour quelles soient compréhensible par MySql.

    Voici un script MySql qui charge une toute petite table. En fait, c'est un exercice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS Cities
    --------------
     
    --------------
    CREATE TABLE Cities (
        Country     CHAR(2),
        City        CHAR(22),
        AccentCity  CHAR(3),
        Region      CHAR(2),
        Population  INT UNSIGNED NULL DEFAULT NULL,
        Latitude    FLOAT,
        Longitude   FLOAT,
            Date        DATETIME
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    TRUNCATE Cities
    --------------
     
    --------------
    set unique_checks      = 0
    --------------
     
    --------------
    set foreign_key_checks = 0
    --------------
     
    --------------
    set sql_log_bin        = 0
    --------------
     
    --------------
    alter table Cities DISABLE KEYS
    --------------
     
    --------------
    commit
    --------------
     
    --------------
    LOAD DATA LOCAL INFILE 'fichier.txt'
         INTO TABLE `Cities`
         CHARACTER SET latin1
         FIELDS TERMINATED BY ','
         ENCLOSED BY '"'
         ESCAPED BY '\\' LINES
         TERMINATED BY '\r\n'
         IGNORE 0 LINES
         (@F1, @F2, @F3, @F4, Population, Latitude, Longitude, @F8)
         set Country = trim(@F1),
                City = trim(@F2),
          AccentCity = trim(@F3),
              Region = trim(@F4),
                Date = outils.chgdate(@F8)
    --------------
     
    --------------
    commit
    --------------
     
    --------------
    alter table Cities ENABLE KEYS
    --------------
     
    --------------
    set unique_checks      = 1
    --------------
     
    --------------
    set foreign_key_checks = 1
    --------------
     
    --------------
    set sql_log_bin        = 1
    --------------
     
    --------------
    commit
    --------------
     
    --------------
    select  concat('>', Country,   '<') as 'Country',
                    concat('>', City,      '<') as 'City',
                    concat('>', AccentCity,'<') as 'AccentCity',
                    concat('>', Region,    '<') as 'Region',
                    concat('>', Population,'<') as 'Population',
                    concat('>', Latitude,  '<') as 'Latitude',
                    concat('>', Longitude, '<') as 'Longitude',
                    concat('>', date,      '<') as 'Date'
    from `Cities`
    --------------
     
    +---------+-----------------------+------------+--------+------------+----------+-----------+-----------------------+
    | Country | City                  | AccentCity | Region | Population | Latitude | Longitude | Date                  |
    +---------+-----------------------+------------+--------+------------+----------+-----------+-----------------------+
    | >fr<    | >dijon bourgogne<     | >---<      | >bo<   | >500000<   | >200<    | >150<     | >2015-12-10 15:20:00< |
    | >fr<    | >paris ile de france< | >---<      | >il<   | >2000000<  | >100<    | >50<      | >2015-06-15 07:15:00< |
    | >fr<    | >nice paca<           | >---<      | >pa<   | >100000<   | >250<    | >75<      | >2015-07-25 19:58:00< |
    | >fr<    | >paca<                | >---<      | >pa<   | >100000<   | >250<    | >75<      | >2015-07-25 19:58:00< |
    +---------+-----------------------+------------+--------+------------+----------+-----------+-----------------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Et voici le fichier à charger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "fr","dijon bourgogne","---","bo",500000,200,150,"10/12/2015 15:20"
    "fr","paris ile de france","---","il",2000000,100,50,"15/06/2015 07:15"
    "fr","nice paca","---","pa",100000,250,75,"25/07/2015 19:58"
    "fr","paca","---","pa",100000,250,75,"25/07/2015 19:58"
    Et pout terminer, mon batch windows qui permet de lancer ce script MySql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @echo off
     
    setlocal enableDelayedExpansion
     
    chcp 1252 > nul
     
    set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH%
     
    SET FIC=%~nx0
    SET FIC=%FIC:bat=sql%
     
    mysql < %FIC%  --verbose  --force
    @echo.
    pause
    exit
    L'exemple avec l'utilitaire MySqlImport ne vous sert à rien, car comme je le suppose, vous ne devez pas charger toutes les colonnes.
    Et pire, vous avez sûrement un formatage à faire sur ces colonnes.
    Inspirez vous de mon exemple. Commencez par un petit jeu d'essai afin de comprendre comment procéder.

    Si vous avez des questions, n'hésitez pas, je reste à votre disposition !

    @+
    merci pour cette réponse détaillé, effectivement je suis entrain de faire et comprendre cet exercice, ca va être un bon début pour moi.
    pour les 500 fichiers csv oui c'est beaucoup, ils sont répartirent sur 12 dossier et le mcd je l'ai fait comme suit :Nom : model-conceptuel.jpg
Affichages : 956
Taille : 106,1 Ko

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut lefi0528.

    Il est inutile de cliquer sur le bouton "répondre avec citation" quand tu veux t'adresser à moi.
    Surtout quand le message suivant, répond au message qui le précède !

    S'il y a plusieurs intervenant, il te suffit de commencer ton message par "@ Artemus24 : " pour t'adresser à moi.

    Est-ce que tu as fait des tests avec mon code ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. [AC-2013] RechDom() avec une Variable comme Nom de Champ
    Par (2t0m) dans le forum Access
    Réponses: 1
    Dernier message: 26/09/2013, 15h07
  2. [PHP 5.2] Récupérer une variable POST avec une variable comme nom
    Par bailamos dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2008, 15h59
  3. Syntaxe Range avec une variable pour la colonne
    Par Spykerman dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/06/2008, 14h50
  4. Utiliser une variable comme nom de fichier
    Par lo00_ dans le forum MATLAB
    Réponses: 1
    Dernier message: 28/06/2006, 14h57
  5. [XSL] utiliser une variable pour nom d'élément
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 07/09/2004, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo