Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Un script pour de la base de donnee
Envoyé par: Nicolasdijon

alors voila...

je suis guitariste et chez moi j'ai pas mal de fichier gp3, gp4, gp5...(se sont des fichiers tablature enfin bref).

j'en ai bien 5000 et j'aimerait faire une base de donnée qui les regroupent.

par exemple pour inserer un champs dans ma table qui correspond a ce fichier:

=> ACDC - Back In Black.gp3

=> INSERT INTO `data` VALUES ('', 'ACDC', 'Back In Black', 'gp3', 'ACDC - Back In Black.gp3');

En fait je fait des copier coller dans les champs...mais je me sent mal me farcir les 5000.

donc j'avais pensé a un petit script que j'éxécuterais qui me lirait chaque fichier et me découperait les informations dont j'ai besoin pour former les requetes SQL dans un fichier texte par exemple.

merci de m'apporter des conseils et des réponses.

Poste le Thursday 28 December 2006 00:52:14
Répondre     Citer    
Re: Un script pour de la base de donnee

Tu pourrais coder le script dans un langage qui manipule facilement les chaines (expressions regumlières) et les bases de données. Ruby, Perl, Python, Ocaml feraient l'affaire.

Tu pourrais aussi coder le script en shell avec des utilitaires comme cut, awk et mysql.

Je n'en sais pas plus, ne connaissant pas les formats gp2 dont tu parles.

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Thursday 28 December 2006 09:01:55
Répondre     Citer    
Re: Un script pour de la base de donnee
Envoyé par: oudoubah

Citation
Nicolasdijon
=> ACDC - Back In Black.gp3

=> INSERT INTO `data` VALUES ('', 'ACDC', 'Back
In Black', 'gp3', 'ACDC - Back In Black.gp3');

sed semble indiqué pour ça :
sed -r "s|(.*) - (.*)\.(gp[3-5])|INSERT INTO 'data' VALUES \('', '\1', '\2', '\3', '\1 - \2.\3');|"

j'ai fait ça de tête, donc il y a peut être des erreurs.

sed affichera la sortie à l'écran, donc tu pourras la rediriger ensuite où bon te semble.

Il y a peut être une meilleure solution à base de awk et string si les informations sont en clair dans le fichier gp?. Pour ça, tu peux déjà voir ce que donne un "string fichier.gp3" et voir si les informations renvoyées sont exploitables.

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 28 December 2006 10:18:57
Répondre     Citer    
Re: Un script pour de la base de donnee

Script en 4 lignes :

for i in  $( ls repetoire_fichiers )
  do 
     echo INSERT INTO \'data\' VALUES \(\",\'${i%%-*}\', \'$( echo $i |sed -e 's/[^-]*-\([^\.]*\)\..*/\1/g' )\',\'${i##*.}\'\)\; >> fichier_script_mysql.sql
  done

--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Thursday 28 December 2006 10:21:53
Répondre     Citer    
Re: Un script pour de la base de donnee
Envoyé par: Sve@r

Citation
Frédéric Brugmans
for i in $( ls repetoire_fichiers )
TROP DANGEREUX !!! Si un des fichiers possède un espace dans son nom, t'auras 2 itérations ratées et le fichier ne sera pas traité
ls repertoire_fichiers |while read i

Sinon le reste a l'air correct quoiqu'un peu trop compacté pour une relecture aisée...

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Thursday 28 December 2006 11:00:52
Répondre     Citer    
Re: Un script pour de la base de donnee
Envoyé par: nicolasdijon


Tout d'abord merci a tous pour vos réponses.

j'ai en premier essayé le script en 4 ligne.
celui ci a l'air pas mal mais j'ai l'impression qu'il y a un soucis avec les espaces.

par exemple pour: Aerosmith - Amazing.gp3

j'obtient:
INSERT INTO 'data' VALUES (",'Aerosmith', 'Aerosmith','Aerosmith');
INSERT INTO 'data' VALUES (",'', '-','-');
INSERT INTO 'data' VALUES (",'Amazing.gp3', 'Amazing.gp3','gp3');

alors que je devrai avoir:
INSERT INTO 'data' VALUES (",'Aerosmith','Amazing','gp3','Amazing.gp3');

je pense qu'il manque pas grand chose...

j'ai essayé avec le:
ls repertoire_fichiers |while read i
mais ca fait la même chose étrange?

la solution avec le SED a l'air bien aussi mais je ne vois pas comment l'exploiter (je suis nul en bash) il me faudrai peut etre un peu plus d'info un code plus détaillé merci bien.

Poste le Thursday 28 December 2006 13:00:12
Répondre     Citer    
Re: Un script pour de la base de donnee

j'ai seulement oublié

IFSBAK=$IFS
IFS=$'\n'

et la pas de risque


--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Thursday 28 December 2006 13:40:22
Répondre     Citer    
Re: Un script pour de la base de donnee
Envoyé par: Nicolasdijon


donc ça donnerai ça?

for i in  $( ls repetoire_fichiers )
  do 
   IFSBAK=$IFS
   IFS=$'\n' 
   echo INSERT INTO \'data\' VALUES \(\",\'${i%%-*}\', \'$( echo $i |sed -e 's/[^-]*-\([^\.]*\)\..*/\1/g' )\',\'${i##*.}\'\)\; >> fichier_script_mysql.sql
  done

ou pas du tout?

Poste le Thursday 28 December 2006 14:01:59
Répondre     Citer    
Re: Un script pour de la base de donnee

Nope


#!/bin/sh

IFSBAK=$IFS
IFS=$'\n' 

for i in  $( ls repetoire_fichiers )
  do 
  echo INSERT INTO \'data\' VALUES \(\",\'${i%%-*}\', \'$( echo $i |sed -e 's/[^-]*-\([^\.]*\)\..*/\1/g' )\',\'${i##*.}\'\)\; >> fichier_script_mysql.sql

  done

--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Thursday 28 December 2006 16:23:32
Répondre     Citer    
Re: Un script pour de la base de donnee
Envoyé par: Sve@r

Citation
Frédéric Brugmans
Nope


#!/bin/sh

IFSBAK=$IFS
IFS=$'\n'

for i in $( ls repetoire_fichiers )
do
echo INSERT INTO \'data\' VALUES
\(\",\'${i%%-*}\', \'$( echo $i |sed -e
's/[^-]*-\([^\.]*\)\..*/\1/g' )\',\'${i##*.}\'\)\;
>> fichier_script_mysql.sql

done

Hum...

Personnellement j'écrirais un script peut-être un peu plus long... mais un peu plus clair pour bien isoler chaque étape dans le découpage du nom. Et surtout je ne toucherais pas à l'IFS car c'est une variable très importante en shell (d'elle dépendent plein de trucs annexes comme la façon de faire du set ou du read etc...)

Exemple
#!/bin/sh
rm -f script.sql
ls repertoire |while read titre
do
    groupe=`echo $titre |cut -f1 -d" -"`
    nom=`echo $titre |cut -f2 -d"- "`
    racine=`echo $nom |cut -f1 -d"."`
    extension=`echo $nom |cut -f2 -d"."`
    echo "INSERT INTO \`data\` VALUES (\",'$groupe','$racine','$extension','$nom');" >> script.sql
done
Ce script part du principe que tous les noms sont de la forme "groupe - titre.xxx". Si évidemment le format des noms est plus variable, il convient de créer un découpage plus intelligent pour répondre à toutes les variantes possibles...

PS: C'est voulu les guillemets et la virgule après la parenthèse ouvrante ???

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Thursday 28 December 2006 17:55:50
Répondre     Citer    
Re: Un script pour de la base de donnee

Pour IFS, oui elle est importante, mais comme le script est lancé dans un "sous-shell", tu récupères ton IFS à la sortie du script

--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Thursday 28 December 2006 18:22:17
Répondre     Citer    
Re: Un script pour de la base de donnee
Envoyé par: Sve@r

Citation
Frédéric Brugmans
Pour IFS, oui elle est importante, mais comme le
script est lancé dans un "sous-shell", tu récupères ton IFS à la sortie du script
Tout à fait. Mais sa valeur est différente de la valeur originelle dans la zone du script située entre le "do" et le "done"...

Personnellement les seuls moments où j'ose toucher à l'IFS sont pour faire un "set. Et à ce moment là, mes modif sont réduites au minimum... voire sur une seule ligne
old="$IFS"; IFS=truc; set machin; IFS="$old"; unset old


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Friday 29 December 2006 15:28:14
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Un script pour de la base de donnee
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons