Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Aller à la page:  1 2 Page suivante
Page: 1 sur 2
script shell et fichier
Envoyé par: torgnol

Bonjour à tous,

Je possède un fichier texte d'environ 380 000 lignes que je dois intégrer dans une base de données.

Une ligne du fichier ressemble environ à ça:

XXXXXXXXXX XXX X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X XX XXXXXXXXXXXXXXX XXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXX X

Je voudrais épurer ce fichier avant de l'importer, car toutes les lignes ne me sont pas utiles.

Pour ce faire, je dois repérer la "valeur" du caractère 753 de chaque ligne, si ce caractère vaut "7", la ligne ne sera pas importée.

Le script que je compte faire, va lire chaque ligne du fichier et extraire vers un nouveau fichier toutes celles dont la valeur du caractère 753 sera différente de 7.

Pour l'instant, j'arrive bien à ouvrir, lire le fichier etc...
mais je n'arrive pas à "repérer" le caractère 753 de chaque ligne, ni déterminer sa valeur.

Voila, j'espère avoir été assez clair, et je remercie d'avance tous ceux qui voudront bien m'aider.

Tchuss

Poste le Tuesday 14 June 2005 14:37:22
Répondre     Citer    
Re: script shell et fichier
Envoyé par: cancerus

Hello,

en résumé, tu veux récupérer le 753ème caractère d'une ligne et, si ce caractère vaut 7, alors la ligne n'est pas importée. Dans le cas contraire, elle l'est. C'est bien ça ?

Poste le Tuesday 14 June 2005 15:25:07
Répondre     Citer    
Re: script shell et fichier
Envoyé par: Fredd

C'est le caractere +-

Poste le Tuesday 14 June 2005 15:30:03
Répondre     Citer    
Re: script shell et fichier
Envoyé par: torgnol

C'est tout à fait ça cancerus (ouf je ne me suis pas trop mal expliqué).

C'est également sur cette étape que je bute (snif!!!)

Ensuite, c'est vrai que je complique un peu la donne, car je veux générer un nouveau fichier à partir du premier mais qui ne contient que les lignes avec les caractère 753 différent de 7.

Par contre Fred je suis désolé mais j'ai du mal à te suivre quand tu dits "le caractère +-"

Merci


Poste le Tuesday 14 June 2005 15:39:55
Répondre     Citer    
Re: script shell et fichier
Envoyé par: benjilebigboss

Tu veux pas plutot le faire en C ? C'est vachement moins chiant nan ?

genre :

un getline que tu met ds un string
tu recupere alors le n-ieme caractere en accedant au tableau du string ...

A moins que tu ne connaisse pas du tout le C ?

Poste le Tuesday 14 June 2005 15:58:43
Répondre     Citer    
Re: script shell et fichier
Envoyé par: torgnol

Je suis pret à accepter toutes les solutions possibles, sauf que le C je n'y connais strictement rien (désolé).

Pourtant, ça me semble réalisable en shell non ?

Poste le Tuesday 14 June 2005 16:06:38
Répondre     Citer    
Re: script shell et fichier
Envoyé par: Fredd

Je croyais que tu recherchais le caracatere 753.

Moi je dirais que c'est un probleme pour du perl winking smiley

Poste le Tuesday 14 June 2005 16:07:19
Répondre     Citer    
Re: script shell et fichier
Envoyé par: torgnol

Ton idée me plait bien Fred, mais là encore je n'y connais rien en Perl (redésolé).

Je suis en train de chercher sur ce bon vieux google mais je ne trouve rien de très intéressant pour l'instant.

Merci

Poste le Tuesday 14 June 2005 16:19:56
Répondre     Citer    
Re: script shell et fichier
Envoyé par: Sve@r

Pas de soucis pour ça, en shell ou en C (sauf que pour certains ce sera plus facile ou plus rapide de le faire en C)

Voici une solution toute simple en shell

#!/bin/sh

# Stockage du fichier dans le buffer 3
exec 3<fichier_a_traiter

# nettoyage du fichier de sortie si déjà existant
rm -f fichier_sortie

# Lecture du buffer 3 ligne par ligne
while read ligne 0<&3
do
.....# Extraction du caractère 753
.....carac=`echo $ligne |cut -c753`

.....# Vérification du caractère extrait - Retour si = 7
.....test "$carac" = "7" && continue

.....# La ligne ne contient pas le "7" - Importation
.....echo "$ligne" >> fichier_sortie
done


Et voilà. En fin de script, le fichier "fichier_sortie" ne contient que les lignes qui t'interressent

A+

Poste le Tuesday 14 June 2005 18:18:54
Répondre     Citer    
Re: script shell et fichier

Avec egrep et les expressions régulieres :

egrep -v '^.{752}7' fichier > nouveau_fichier

--
Brugmans Frédéric

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

Poste le Tuesday 14 June 2005 18:58:25
Répondre     Citer    
Re: script shell et fichier
Envoyé par: Sve@r

Citation
Brugmans Frédéric
Avec egrep et les expressions régulieres :

egrep -v '^.{752}7' fichier > nouveau_fichier

--
Brugmans Frédéric - Chercheur ( d'avenir )

Rhaaaa trop fort !!!
Moi je dis "superbe"!!!

Bon, c'est vrai que j'ai pas eu le réflexe de penser à "expression régulière". Mais je vais me rattrapper en l'expliquant pour "Torgnol" qui semble débuter avec difficulté mais qui s'accroche...

Le programme "grep" (global regular expression patern) est un programme de recherche de ligne dans un fichier. Il se dérive en d'autres programmes comme "fgrep" (fast grep) ou "egrep" (expression grep) utilisé ici.
L'option "-v" demande "ce qui n'est pas"
Le caractère "^" demande "ce qui commence par"
Le "." signifie "n'importe quel caractère"
Le "{752}" signifie "répété 752 fois"
Le "7" est bien entendu le caractère recherché

Donc, ce "egrep" va rechercher toutes les lignes ne commençant pas par n'importe quel caractère répété 752 fois puis suivi d'un "7". Il va extraire ces lignes et les écrire dans "nouveau_fichier"

On peut pas faire mieux !


Poste le Tuesday 14 June 2005 21:49:24
Répondre     Citer    
Re: script shell et fichier

une remarque comme cela venant de Sve@r, cela fait toujours plaisir. Merci ! O-uu-O

--
Brugmans Frédéric

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

Poste le Tuesday 14 June 2005 22:40:34
Répondre     Citer    
Re: script shell et fichier
Envoyé par: torgnol

Merci pour votre aide les gars.

Alors pour la solution de sve@r c'est en cours de traitement (j'ai oublié de dire que mon fichier en entrée fait 550 Mo)et merci pour les explications.

Pour la solution de Frédéric, je n'obtiens qu'une seule ligne dans le fichier de sortie: "Fichier binaire nom_fichier concorde"

Sans vouloir trop abuser de votre gentillesse ;-), mais je pense que l'on est pas trop loin du but.

Tchuss

Poste le Wednesday 15 June 2005 10:32:44
Répondre     Citer    
Re: script shell et fichier
Envoyé par: Sve@r

Citation
torgnol
Merci pour votre aide les gars.

Alors pour la solution de sve@r c'est en cours de
traitement (j'ai oublié de dire que mon fichier en
entrée fait 550 Mo)et merci pour les
explications.

Pour la solution de Frédéric, je n'obtiens qu'une
seule ligne dans le fichier de sortie: "Fichier
binaire nom_fichier concorde"

Sans vouloir trop abuser de votre gentillesse ,
mais je pense que l'on est pas trop loin du but.

Tchuss

Citation
torgnol
Merci pour votre aide les gars.

Alors pour la solution de sve@r c'est en cours de
traitement (j'ai oublié de dire que mon fichier en
entrée fait 550 Mo)et merci pour les
explications.

Pour la solution de Frédéric, je n'obtiens qu'une
seule ligne dans le fichier de sortie: "Fichier
binaire nom_fichier concorde"

Sans vouloir trop abuser de votre gentillesse ,
mais je pense que l'on est pas trop loin du but.

Tchuss

550 Mo c'est évidemment un gros fichier. Le traitement aurait été plus rapide en C !!!

Tu peux avoir envie de vérifier le travail en cours. Tu as la première solution de tout arrêter et d'insérer un compteur de ligne dans le script
i=0 (avant le "while ...")
i=`expr $i + 1`
echo "$i" (tout ça entre le "do" et le "done")

Ou alors tu ouvres une deuxième fenêtre et tu tapes "wc -l fichier_sortie" de temps en temps. Cela te donne la taille de ce fichier en nb de lignes et tu verras donc cette taille grossir
Pour vérifier le fichier sortie même en cours de traitement, tu peux faire un "more" dessus ou même un "vi" mais en faisant gaffe de ne pas sauvegarder, ou alors tu le copie et tu examine la copie

Je suis étonné que la solution de Brugman ne fonctionne pas parce qu'elle utilise un programme compilé au lieu d'un script => Hyper plus rapide.
Essaye de taper "grep" au lieu de "egrep"...



Poste le Wednesday 15 June 2005 15:36:02
Répondre     Citer    
Re: script shell et fichier
Envoyé par: oudoubah

Pour voir le fichier de sortie se remplir, un "tail -f fichier" te permettra de voir le contenu, donc l'avancement et les résultats que ça donne.

"egrep" est équivalent à "grep -E" dixit man. Si egrep n'est pas connu, tu peux donc le remplacer par ça.

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 Wednesday 15 June 2005 15:43:29
Répondre     Citer    
Re: script shell et fichier
Envoyé par: torgnol

Merci à tous :-)

En plus de ça j'ai une autre complication par rapport au programme de sve@r.

Comme vous pouvez le lire dans mon message d'origine, les lignes mon fichier ont une mise en forme bien particulière avec des espaces.

Or le fait de le charger dans un buffer, casse complètement cette mise en forme, un bref apperçu du fichier pour une ligne donne ceci:

XXXXXXXXXXXXXXXX XXXX XX X XXXXXXXXXXXX XXXX XXXXXXXXXXXX

Du coup mon caractère 7 n'est plus en position 753 (les lignes du fichiers font moins de 400 caractères) et j'obtiens un fichier de sortie vide :-(

Je finis par me demander si le C ou Perl n'arriveraient pas à mieux gérer le format particulier de mon fichier, mais étant donné que je ne connais rien à des deux langages, je me plante peut etre complètement.

Tchuss @:-)

Poste le Wednesday 15 June 2005 16:28:33
Répondre     Citer    
Re: script shell et fichier

tu peux donner les resultat de ls -la fichier et file fichier ?

--
Brugmans Frédéric

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

Poste le Wednesday 15 June 2005 19:57:46
Répondre     Citer    
Re: script shell et fichier
Envoyé par: Sve@r

Citation
torgnol
Comme vous pouvez le lire dans mon message
d'origine, les lignes mon fichier ont une mise en
forme bien particulière avec des espaces.

Or le fait de le charger dans un buffer, casse
complètement cette mise en forme, un bref apperçu
du fichier pour une ligne donne ceci:

XXXXXXXXXXXXXXXX XXXX XX X XXXXXXXXXXXX XXXX
XXXXXXXXXXXX

Tchuss

Tu fais erreur. Si ton fichier ne contient que des caractères imprimables (fichier texte), alors le fait de le charger dans un buffer et de le relire avec "read" ne change rien à son format. Les espaces restent là où ils sont. Tu peux essayer en lisant "/etc/hosts" ou autre fichier texte.

Un fichier texte n'est qu'une suite d'octets imprimables mis les uns à la suite des autres avec, de temps en temps, un retour chariot (ctrl-m). Lorsque tu ouvres avec un éditeur comme "vi", il analyse et remplace ce ctrl-m par un saut de ligne à l'écran d'où l'affichage bien rangé ligne par ligne. Mais cette notion de ligne n'est que visuelle.

La commande "read" lit un bloc d'octets et s'arrête au ctrl-m donc ta variable contiendra une ligne. Mais elle ne transforme pas cette ligne

Maintenant, si ton fichier ne contient pas que du texte (mp3, vidéo, etc), alors c'est plus grave car il peut contenir des caractères de code ascii 13 (ctrl-m) qui ne sont pas là pour signifier la fin de ligne mais que "read" interprète de cette manière parce qu'il croit que tu lui fais bouffer du texte et que, dans du texte, le ctrl-m signifie "fin de ligne"

=> d'où le pb que tu as eu avec "egrep" qui analyse aussi des fichiers textes et la demande de Brugman qui te demande un "file" pour connaître le type de fichier que tu utilises...

Pour savoir si ton fichier est du texte, tu peux faire un "strings fichier_entree >fichier_sortie" et faire ensuite un "cmp fichier_entree fichier_sortie"
La commande "strings" extrait les octets imprimables d'un fichier. Si ton fichier est du texte le fichier sortie sera identique et "cmp" ne verra pas de différence sinon...

Poste le Thursday 16 June 2005 08:49:47
Répondre     Citer    
Re: script shell et fichier
Envoyé par: Gounette

J'aurai voulu savoir, la différence d'utilisation entre egrep, fgrep et grep??

Poste le Thursday 16 June 2005 22:00:12
Répondre     Citer    
Re: script shell et fichier
Envoyé par: nicola

man grep ?

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Thursday 16 June 2005 23:30:00
Répondre     Citer    
Aller à la page:  1 2 Page suivante
Page: 1 sur 2

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
script shell et fichier
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.
Nouveau sujet sur ce forum

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