Manipulation de fichier, besoin d optimisation [script] - Linux et OS Alternatifs
Marsh Posté le 09-07-2004 à 19:04:44
Bonjour, j'ai un fichier d'une seule ligne (c'est à dire sans caractère de retour à la ligne (\n , \r\n)). Je dois exploiter ces fichiers, et pour ce faire j'ai besoin de les "formatter", c'est à dire reconstituer des lignes. je travail sous W2k, et j'ai récupéré unixtools (les commandes unix sous Win). J'ai fais un awk, mais celui-ci est TRES lent (les fichiers peuvent atteindre 4 Go). comment faire une substitution simple ? (sprintf, split, perl, ???) la chaine est identifiée comme suit : [0-9][0-9][0-9][0-3][0-9]\/[0-1][0-9]\/20[0-1][0-9] et donc il suffirait d'insérer un caractére "\n" avant cette chaine autant de fois qu'elle est rencontrée dans la ligne. dans un fichier moyen de 200 Mo (1 seule ligne) je génère environ 2.600.000 Lignes au final. Voici ce que j'ai fais : Exécution du awk qui a pour but d'insérer un retour chariot dès que la chaine est rencontrée. Syntaxe du awk : { posdepart=1 while ( length($0) >= posdepart ) { if ( substr($0,posdepart,13) ~ /[0-9][0-9][0-9][0-3][0-9]\/[0-1][0-9]\/20[0-1][0-9]/ ) { printf "\n%s", substr($0,posdepart,1) } else { printf "%s", substr($0,posdepart,1) } posdepart++ } } En fait je lis le fichier caractere par caractere, et à chaque fois que je rencontre ma chaine, j'insere un retour chariot. Merci de votre aide.
Make sure you enter the(*)required information where indicate.HTML code is not allowed
Marsh Posté le 09-07-2004 à 19:04:44
Bonjour,
j'ai un fichier d'une seule ligne (c'est à dire sans caractère de retour à la ligne (\n , \r\n)).
Je dois exploiter ces fichiers, et pour ce faire j'ai besoin de les "formatter", c'est à dire reconstituer des lignes.
je travail sous W2k, et j'ai récupéré unixtools (les commandes unix sous Win).
J'ai fais un awk, mais celui-ci est TRES lent (les fichiers peuvent atteindre 4 Go).
comment faire une substitution simple ? (sprintf, split, perl, ???)
la chaine est identifiée comme suit :
[0-9][0-9][0-9][0-3][0-9]\/[0-1][0-9]\/20[0-1][0-9]
et donc il suffirait d'insérer un caractére "\n" avant cette chaine autant de fois qu'elle est rencontrée dans la ligne.
dans un fichier moyen de 200 Mo (1 seule ligne) je génère environ 2.600.000 Lignes au final.
Voici ce que j'ai fais :
Exécution du awk qui a pour but d'insérer un retour chariot dès que la chaine est rencontrée.
Syntaxe du awk :
{
posdepart=1
while ( length($0) >= posdepart ) {
if ( substr($0,posdepart,13) ~ /[0-9][0-9][0-9][0-3][0-9]\/[0-1][0-9]\/20[0-1][0-9]/ )
{ printf "\n%s", substr($0,posdepart,1) } else { printf "%s", substr($0,posdepart,1) }
posdepart++ }
}
En fait je lis le fichier caractere par caractere, et à chaque fois que je rencontre ma chaine, j'insere un retour chariot.
Merci de votre aide.