Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/09/2014, à 16:51

remssssss

splitter un fichier selon un pattern Regex

Bonjour,

J'ai un fichier contenant n blocks de texte separés par un saut de ligne.
J'aimerais decouper ce fichier selon les sauts de ligne, de facon a avoir n fichiers contenant chacun un block de texte.

Voila a peu pres comment se presente mon fichier original :

Text1;Text1;Text1;Text1;
Text1Text1Text1Text1Text1

Prop1;Prop1;Prop1;Prop1
Prop1Prop1Prop1Prop1

Text2;Text2;Text2;Text2;
Text2Text2Text2
TextText2Text2Text2

Prop2;Prop2 Prop2 Prop2
Prop2 Prop2 Prop2

Et voila ce que j'aimerais obtenir :
fichier1.txt :
Text1;Text1;Text1;Text1;
Text1Text1Text1Text1Text1

Prop1;Prop1;Prop1;Prop1
Prop1Prop1Prop1Prop1

puis, le fichier2.txt :
Text2;Text2;Text2;Text2;
Text2Text2Text2
TextText2Text2Text2

Prop2;Prop2 Prop2 Prop2
Prop2 Prop2 Prop2


Pour info, j'ai essayé d'utiliser la fonction csplit mais je n'arrive pas a preciser le pattern 'saut de ligne'

Merci pour vos contributions,

Hors ligne

#2 Le 19/09/2014, à 18:22

pingouinux

Re : splitter un fichier selon un pattern Regex

Bonjour,
Voici une proposition en python.

cat decoupage.py

#! /usr/bin/python

import sys, re

rec=re.compile('(.*?\n\n){2}',re.S)

with open(sys.argv[1],'r') as f :
   fic=f.read()

   n=0
   while True :
      k=rec.search(fic)
      if(k) :
         n+=1
         with open('fichier%d.txt'%n,'w') as g :
            g.write(fic[:k.start(0)])
            g.write(k.group(0))
            fic=fic[k.end(0):]
      else :
         if fic :
            n+=1
            with open('fichier%d.txt'%n,'w') as g :
               g.write(fic)
         break

À appeler ainsi

./decoupage.py fichier_original

Hors ligne

#3 Le 19/09/2014, à 21:12

remssssss

Re : splitter un fichier selon un pattern Regex

Je vais essayer.
Pourrais tu me dire ce que tu fais exactement ? histoire de comprendre le code...!
Merci

Hors ligne

#4 Le 19/09/2014, à 21:51

pingouinux

Re : splitter un fichier selon un pattern Regex

J'ai un peu simplifié, et ajouté des commentaires.

#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys, re

# Compilation d'une expression régulière :
# Recherche de 2 occurrences consécutives de : la plus petite chaîne de caractères
# (pouvant contenir des '\n'), et suivie d'au moins 2 '\n' consécutifs. 
rec=re.compile('(.*?\n\n+){2}',re.S)

# Lecture du fichier donné en argument du script
with open(sys.argv[1],'r') as f :
   fic=f.read()

   n=0
   while True :         # Boucle infinie
      k=rec.search(fic)
      if(k) :           # L'expression régulière est-elle trouvée ?
         n+=1           # Numéro du fichier créé
         with open('fichier%d.txt'%n,'w') as g :
            g.write(k.group(0)) # Écriture de la chaîne trouvée
            fic=fic[k.end(0):]  # fic = fin du fichier
      else :
         if fic :       # Reste-t-il quelque chose à écrire ?
            n+=1        # Numéro du fichier créé
            with open('fichier%d.txt'%n,'w') as g : g.write(fic)
         break          # Sortie de la boucle

Hors ligne

#5 Le 20/09/2014, à 09:22

credenhill

Re : splitter un fichier selon un pattern Regex

hello

$ awk 'BEGIN {f=1} !NF && and(1, n++) {++f; next} {print $0 > "fichier" f ".txt"}'  fich
$ more fichier*
::::::::::::::
fichier1.txt
::::::::::::::
Text1;Text1;Text1;Text1;
Text1Text1Text1Text1Text1

Prop1;Prop1;Prop1;Prop1
Prop1Prop1Prop1Prop1
::::::::::::::
fichier2.txt
::::::::::::::
Text2;Text2;Text2;Text2;
Text2Text2Text2
TextText2Text2Text2

Prop2;Prop2 Prop2 Prop2
Prop2 Prop2 Prop2 

Hors ligne