#1 Le 19/09/2014, à 15: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, à 17: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, à 20: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, à 20: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, à 08: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