Se connecter / S'enregistrer
Votre question

Extraire dans un batch la ligne numéro N d'un fichier texte

Tags :
  • Batch
  • Programmation
Dernière réponse : dans Programmation
15 Novembre 2011 18:20:10

Bonjour,

La commande suivante :

find /N "ATTRIB" exemple.dxf >attrib.txt

me permet de lister toutes les lignes contenant ATTRIB dans le fichier exemple.dxf

---------- exemple.DXF
[154432]ATTRIB
[154470]ATTRIB
[154508]ATTRIB
[154546]ATTRIB


Je constate que la première ligne contenant "ATTRIB" est la ligne N° 154432

J'en viens à ma question:

Comment obtenir le contenu de la 20ème ligne après soit la ligne 154452 ?

Merci d'avance de votre aide

Didier

Autres pages sur : extraire batch ligne numero fichier texte

17 Novembre 2011 07:22:07

Bonjour CRicky,

Merci de ta réponse. Selon ton conseil, j'ai commencé à utiliser Python.

J'ai déjà trouve la commande pour extraire une ligne de mon fichier:

import linecache
linecache.getline('c:\TEST.dxf,154452)

J'obtiens le résultat suivant
'140546.0\n'

J'ai 3 questions:

Comment éviter les caractères \n ?

Comment se fait il que je sois obliger d'écrire le nom du fichier en majuscule alors qu'il est en minuscule dans c:\ ?

Je n'ai pas trouvé la commande équivalente à find /N "ATTRIB" test.dxf >attrib.txt ?

Si j'abuse, je te demanderai si tu n'as pas un programme simple à me fournir comme exemple afin de savoir comment démarrer mon 1er programme qui consiste aux actions suivantes à partir d'un listing :

lecture du listing
ouverture du 1er fichier de la liste
recherche du numéro de la 1ère ligne contenant ATTRIB, soit ligne N
renommer le fichier avec le contenu de la ligne N+20
Puis bien sur recommencer pour chaque fichier

Merci d'avance

Didier
Contenus similaires
17 Novembre 2011 15:15:16

Salut,

Ci dessous exemple en Python :

  1. #!/usr/bin/env python
  2. ##
  3. ## Made by slake
  4. ##
  5. ## Started on Thu Nov 17 14:51:06 2011 slake
  6. ## Last update Thu Nov 17 15:01:14 2011 slake
  7. ##
  8.  
  9. import sys, os
  10.  
  11. pattern="ATTRIB"
  12. n=20
  13.  
  14. for filename in sys.argv[1:]: # for each file given in parameter
  15. fd = open(filename, 'r')
  16. print "Reading %s" % filename
  17. newFilename = False
  18. while True:
  19. line = fd.readline()
  20. if not line: break # EOF
  21. line = line.strip() # we delete delete the Carriage Return
  22. if pattern in line:
  23. print "pattern in #%s#" % line
  24. while n:
  25. line = fd.readline()
  26. if not line:
  27. sys.exit(0) # EOF, not enought lines
  28. n -= 1
  29. newFilename = line.strip()
  30. fd.close()
  31. if newFilename != False:
  32. print "Moving %s to %s" % (filename, newFilename)
  33. os.rename(filename, os.path.dirname(filename) + newFilename)
17 Novembre 2011 19:38:36

Salut Slake,

Merci de ta réponse, on est pas loin du résultat. Tu as juste fait une petite erreur à la fin pour renommer le fichier, car mon fichier test.dxf est renommé ATTRIB alors qu'il doit être renommé avec le contenu de la 20ème ligne suivant la découverte de la 1ère ligne ATTRIB.
De plus, il faut conserver l'extension .dxf
Comment faut il faire sur ce forum pour mettre des pièces jointes afin de te donner un exemple ?

Didier
a b L Programmation
17 Novembre 2011 19:56:06

Personnellement, je préfère récupérer le contenu et séparer la chaine en listes de lignes sur le \n (qui du coup est supprimé). ;) 
listeLignes = fd.read().split('\n')


Un fois tout chargé en tableau, c'est beaucoup plus facile pour chercher une ligne et faire un saut de ligne.
19 Novembre 2011 09:58:40

psi-cad a dit :
Salut Slake,

Merci de ta réponse, on est pas loin du résultat. Tu as juste fait une petite erreur à la fin pour renommer le fichier, car mon fichier test.dxf est renommé ATTRIB alors qu'il doit être renommé avec le contenu de la 20ème ligne suivant la découverte de la 1ère ligne ATTRIB.
De plus, il faut conserver l'extension .dxf
Comment faut il faire sur ce forum pour mettre des pièces jointes afin de te donner un exemple ?

Didier


http://pastebin.com/qn3NgnJc

J'ai corrigé pour prendre en compte l'extension du fichier. Par contre le fichier est bien renommé avec le contenu de la 20eme ligne.



CRicky a dit :
Personnellement, je préfère récupérer le contenu et séparer la chaine en listes de lignes sur le \n (qui du coup est supprimé). ;) 
listeLignes = fd.read().split('\n')


Un fois tout chargé en tableau, c'est beaucoup plus facile pour chercher une ligne et faire un saut de ligne.


Je préfére aussi dans le cas d'un utilisation personnelle où je connais mes besoins. Malheureusement, dans ce cas, je ne connais pas la taille de son fichier et je ne souhaite pas ouvrir puis lire un fichier conséquent si je ce que je souhaite est au debut de ce dernier.
19 Novembre 2011 19:37:15

Bonsoir,

Merci de ta réponse pour l'extension, j'avais trouvé en cherchant un peu. Par contre, il semble que tu cherches toutes les lignes commencant par ATTRIB alors qu'il faut s'arréter à la 1ère. Puis prendre le contenu de la 20 ligne après.

Comment puis je t'envoyer un exemple de fichier dxf (plus de 150000 lignes effectivement) afin que tu constates le pb pour renommer ?

Merci d'avance

Didier
21 Novembre 2011 23:56:27

Bonsoir,

Je te remercie, c'est bon et j'ai compris pourquoi, cela ne marchait quand tu lisais par erreur jusqu'à la dernière occurence de ATTRIB. En fait, le hasard faisait que la 20 ème ligne après cette dernière occurence était vide et du coup, la commande pour renommer contenait la mauvaise chaine de caractère.
Cela ma semblé correct de ma part d'apporter cette précision.

Je vais maintenant le tester en vrai grandeur avec un listing contenant plusieurs fichiers de plus de 400 ou 500000 lignes chacun.

Par contre, n'ayant pas compris la syntaxe des 1ère lignes suivantes:
  1. for filename in sys.argv[1:]: # for each file given in parameter
  2. dirname = os.path.dirname(filename)
  3. filename = os.path.basename(filename)


J'ai executé pour l'instant le programme avec:

  1. import sys, os
  2. pattern="ATTRIB"
  3. n=20
  4. filename='c:\TEST1.dxf'
  5. fd = open(filename, 'r')
  6. print "Lecture de %s" % filename
  7. newFilename = False
  8. while True:
  9. line = fd.readline()
  10. if not line: break # EOF
  11. line = line.strip() # we delete delete the Carriage Return
  12. if pattern in line:
  13. while n:
  14. line = fd.readline()
  15. if not line:
  16. sys.exit(0) # EOF, not enought lines
  17. n -= 1
  18. newFilename = line.strip()
  19. ext = filename.split('.')[1]
  20. newFilename = newFilename + '.' + ext
  21. break
  22. fd.close()
  23. if newFilename != False:
  24. print "Rename %s to %s" % (filename, newFilename)
  25. os.rename(filename, os.path.dirname(filename) + newFilename)


Comment faut-il lire un fichier texte qui contiendrait:

test1.dxf
test2.dxf
test3.dxf
......

Merci d'avance

Didier
22 Novembre 2011 17:22:12

Ces lignes te permettent de lancer le programme dans une console ou dans l'invité de commande Windows en précisant les fichiers à traiter dans la ligne de commande.:

python.exe script.py file1.dxf file2.dxf ..\..\file3.dxf E:\file4.dxf


L'idée de c'est de pourvoir de traiter rapidement un nombre important de fichiers.
24 Novembre 2011 19:49:48

Bonsoir,

Je te remercie. Je suis très content du résultat et je suis impressionné de la vitesse à laquelle le langage python est capable un fichier de plusieurs centaines de milliers de lignes.

Cordialement

Didier
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS