Forum Programmation.shell Insertion de chaque nouvelle ligne d'un fichier txt dans une table mysql

Posté par  .
Étiquettes : aucune
0
29
juin
2006
Bonjour,

Voilà mon problème:
J'ai un fichier texte ( tableau au format csv , le séparateur étant la virgule) utilisé par une application tout le temps. L'application écris dans ce fichier ligne par ligne. Le fichier change chaque jour (son nom étant Audit20060629.csv pour le 29 juin par exemple.) J'accéde à ce fichier via un share windows (samba samba... je sais, j aurai préféré nfs mais je suis le seul sous linux avec mes serveurs, et impossible de délocalisé le fichier Audit ailleur)
J'aimerai trouver une méthode pour insérer chaque nouvelle ligne de ce fichier dans une table.
De plus la 1ère ligne du fichier est a ne pas insérer (elle contient l entête des colonnes)
Au début j'ai pensé à script avec un tail, mais je ne sais pas comment récupérer les infos visibles à l'écran ni les insérer depuis un script bash.
Quelqu'un aurait il une idée ? (je ne connais pas PHP mais si le code est pas trop compliqué je devrais m'en sortir)

D'avance milles mercis.
  • # awk est ton ami.

    Posté par  . Évalué à 2.

    awk -F\; ' NR >1 {
    ....
    }' fichier_csv

    le -F\; indique que ton separateur de champ est le caractere ';', NR>1 : la séquence qui suit sera exécutée si le numéro d'enregistrement (la ligne) est supérieur à un.

    Dans le bloc entre accolade, tu accède à chaque champ de ton tableau par son numéro: $1 correspond à la première colonne, $2 à la seconde. Tu peux initialiser tes requetes dans une variable et les exécuter à l'aide de la fonction awk "system", ou générer un fichier decommande sql et l'exécuter après sa génération par awk.
  • # précisions

    Posté par  . Évalué à 1.

    je vais essayer de developper un peu :

    j aimerai que l insertion dans la base mysql se fasse au même instant ( on va dire moins de 5 sec apres) que l'écriture dans le fichier.

    apres avoir lus la doc, j ai trouvé ca :

    mkfifo /mysql/db/x/x
    chmod 666 /mysql/db/x/x
    find / -ls > /mysql/db/x/x
    mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x

    je me suis dis qu en remplacant le find par un tail -f sur mon fichier ca devrais marcher.
    Problème: la derniere ligne est pas trés explicite dans l'exemple. Chez moi, l 'exemple donnerait ca:

    mkfifo /mnt/fifo/titi
    chmod 666 /mnt/fifo/titi
    tail -f monfichier.csv > /mnt/fifo/titi

    mais je ne sais pas comment modifier la ligne suivante pour qu elle colle a cas:
    mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.