[..] Supression de caractere dans gros fichier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

[..] Supression de caractere dans gros fichier

#1

Message par Iste »

Salutations,

Je viens demander a l'aide car je manque cruellement de temps en ce moment et n'ai pas le temps de me pencher sur un probleme.

J'ai un 'petit' fichier base de données qui a été corrompu suite a un passage sous linux (me demandez pas pourquoi...)
En gros, c'est un fichier texte et il a été ajouté en fin de chaque ligne (crlf) un cr...
La base de données a continué d'etre rempli, donc pas question de se la jouer "une ligne sur deux", je cherche donc a supprimer tout les cr seul !

Bien sur, c'est facile a faire, alors pourquoi cette demande ? car les fichiers sont tres gros et je ne sais pas comment lire et modifier un fichier partiellement en AutoIt. Du coup, je me retrouve avec deux variable de plusieurs go, ce qui passe bien sur pas. Surement une histoire de FileReadLine() mais chez moi la memoire se sature a tout les coup.
Je sais bien le faire en Java, mais la machine ou se trouve se fichier est pas facile d’accès, je prend donc moins de risque en lançant un .exe

Dans l'absolu rien de vital, je récupérerai ces fichier plus tard sur mon ordi pour les modifier. Mais ca sera long, surtout a reenvoyer... tres long... et difficile de se passer de cette base de données pour le moment :s

merci d'avance pour vos réponses.
Signez ici
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#2

Message par jchd »

GnuGrep ?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
moi
Niveau 7
Niveau 7
Messages : 370
Enregistré le : sam. 09 juil. 2011 22:14
Localisation : devant sont ordinateur
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#3

Message par moi »

_ReplaceStringInFile()
permet de remplacer certains caractère dans un fichier y compris remplacer les "cr" en ""

c'est ce que tu cherche :?: :?: :?:
le problème ce n'est pas un problème, le seul problème ici c'est nous.

j'aime NYAN CAT Image
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#4

Message par Tlem »

En AutoIt, je verrais deux solutions :

1 - On ouvre le fichier source en lecture, on le lit caractère par caractère tout en le 'reconstruisant' au fur et à mesure dans un fichier neuf sans les CR évidement.

2 - On utilise FileSetPos pour se déplacer dans le fichier, y lire les valeurs une à une puis si on trouve un CR on l'efface (cf la section Remarks de la commande FileSetPos), puis on continue ...

J'ai pas testé, mais je pense que ça fonctionne.

Edit : @moi
_ReplaceStringInFile() sera limité par la taille du fichier.
J'ai déjà évoqué cela dans un de mes précédents message. La limite ce situe aux environs de 120 Mo ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
moi
Niveau 7
Niveau 7
Messages : 370
Enregistré le : sam. 09 juil. 2011 22:14
Localisation : devant sont ordinateur
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#5

Message par moi »

ou alors fileread puis stringreplace.
le problème ce n'est pas un problème, le seul problème ici c'est nous.

j'aime NYAN CAT Image
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#6

Message par Iste »

@moi : avez vous lu ou juste réfléchi a la problématique soulevée ?

@Tlem : j'ai un peu de temps, je vais regarder ca de suite voir ce que ca donne.

@jchd : ca serait pas un vilain troll ca ?
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#7

Message par Tlem »

@Iste
V'la un mix fait pas notre ami jchd !!! :mrgreen:
http://www.autoitscript.com/forum/topic ... _p__883877
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#8

Message par Iste »

Je viens de faire le test son mon pc de boulot, meme probleme de saturation de mémoire :/
Enfin, ca reste bien moindre et fix. Mais je pense pas pour autant que ca passera :s
Je vias essayer de regarder ce code demain matin (la un peu mort)

merci beaucoup !
Signez ici
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#9

Message par mikell »

Heu mes excuses par avance pour le côté un peu bourrin de la méthode, mais pourquoi ne pas utiliser un "file splitter" comme HJSplit ou http://www.addictivetips.com/windows-ti ... ext-files/ pour découper le fichier en morceaux raisonnables, traiter chaque morceau, puis réassembler ? :shock:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#10

Message par Tlem »

Je suppose que le but est de faire ca en AutoIt pour un contrôle total. :roll:

En fait, AutoIt peut faire la même chose ...
Il suffit de lire le fichier par tronçon puis de traiter en mémoire et enfin d'enregistrer. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#11

Message par Iste »

@mikell : Ca pourrait etre une solution, mais exécuter un script AutoIt est déja limite, vais pas me risquer a installer un autre logiciel.
Le plus, il reste le risque de couper le fichier sur un des éléments corrompu et de ne pas le voir, ou de couper au milieu d'un crlf et de prendre le cr pour un probleme.

Apres oui AutoIt pourrait le faire, mais le travail sur des fichier prend un peu trop de mémoire, donc au final je serai quand même coincé ^^'

Bref, je vais essayer de trouver un peu de temps cet aprem pour regarder le script que m'a linké Tlem pour comprendre ce qui demande de la mémoire dedans. Je vous tiendrais au courant.
Signez ici
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#12

Message par mikell »

Tlem a écrit :Je suppose que le but est de faire ca en AutoIt pour un contrôle total. :roll:
Ah, j'avais cru comprendre que le but était d'abord de faire ça de manière fiable et sécurisée :roll:

@Iste
"HJSplit for MS-DOS" fait 10 Ko, peut être mis en FileInstall et fonctionne en ligne de commande
De plus les coupures sont franches, sans ajout ou retrait de quoi que ce soit
Enfin "couper le fichier sur un des éléments corrompu" j'y crois pas trop vu que la corruption c'est juste l'ajout de CR
Je vois plutôt ces arguments comme : " zallez voir, ake je vais y arriver à faire ça en AutoIt pur et dur, nondidiou " :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
moi
Niveau 7
Niveau 7
Messages : 370
Enregistré le : sam. 09 juil. 2011 22:14
Localisation : devant sont ordinateur
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#13

Message par moi »

Iste a écrit : il a été ajouté en fin de chaque ligne (crlf) un cr...
on peut utiliser un _FileReadToArray et remplacer tout les "cr" par des ""
mais le probleme est la taille de l'array qui risque d'être plus qu'énorme...
le problème ce n'est pas un problème, le seul problème ici c'est nous.

j'aime NYAN CAT Image
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#14

Message par Iste »

@mikell : Bah si je coupe a coté d'un cr, comment savoir qu'il est seul ?
Je peux regarder l'autre fichier, mais ca devient un peu compliqué pour pas grand chose. De plus, il me faudrait quand meme découper des centaines de petits bout, ca risque de devenir glissant.
Enfin, j'aimerai quand meme avoir un code tout pret, pour le jour ou le probleme reviendra...
Je garde quand meme cette solution de coté car si ce logiciel ne consomme pas trop pendant la découpe (contrairement a ce que je sais faire avec AutoIt pour le moment) ca pourrait bien dépanner.

@moi : bien ! Vous venez de comprendre le probleme.
Signez ici
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#15

Message par Iste »

Alors, avec ce code ca semble passer (bien que je suis sur d'avoir essayé :/)

Code : Tout sélectionner

$file = FileOpenDialog("","D:\Dev\Tests\Thunderbird\Thunderbird\Data\profile\Mail\Local Folders\Inbox.sbd\Iste.sbd\iste.me.sbd","")
Local $hInpf = FileOpen($file)
If $hInpf <> -1 Then
    Local $hOutf = FileOpen($file & ".out", 2)
    If $hOutf <> -1 Then
        Local $ret, $data, $done
        Do
;~             $ret = FileSetPos($hInpf, 58, $FILE_CURRENT)
;~             If Not $ret Then ExitLoop
            $data = FileRead($hInpf, 2112)
            $done = (@error = -1)       ; read incomplete (EOF reached) but maybe something to write anyway
            FileWrite($hOutf, StringReplace($data, @CR&@CR, @CR))
            ; process write error
        until $done
        FileClose($hInpf)
        FileClose($hOutf)
    Else
        ; process error
    EndIf
    ; process error
EndIf
Mais je retrouve le meme probleme de découpe (des @CR@CR qui restent) De plus, a quoi sert le FileSetPos() du coup ? je ne comprend pas trop l'utilité, si ce n'est sauter 58 caractères sur 2112 :/ (ainsi que les 58premiers)

Si ca marche bien, j'ajouterai de quoi eviter les découpe entre deux cr
Signez ici
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#16

Message par jchd »

@iste,

Pourquoi un troll ? J'pige pas, mais alors pas du tout.

Ceci dit, si tu tiens absolument à faire ça en AutoIt, tu as capté que ça va prendre des siècles (toute proportion gardée).
Approche con : tu traites caractère par caractère avec un look-ahead d'un caractère (prévoir deux fois des siècles).
Approche plus chiante et moins efficace en AutoIt : tu lis un buffer (chais pas moi, 1 Mo ou ce que tu veux), tu fais ton regexpreplace, tu testes le caractère suivant dans le fichier si le dernier caractère du buffer est CR pour savoir comment le traiter, tu récris tout, etc.

AutoIt ne disposant pas de pointeurs ne facilite pas vraiment ce genre de traitements sur des chaînes longues. PCRE est efficace mais les deux interfaces dispo sous AutoIt forcent la "recompilation" du pattern à chaque emploi.

@Tlem,

Euh, ce mix (qu'entends-tu par là ?) traite un format fixe, alors qu'on a ici un format variable si j'ai bien compris.
Si tu voulais dire que j'avais initialement mal interprété le coup du "jump", certes c'est vrai but English is not my mothertongue.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#17

Message par GaRydelaMer »

Salut

j'ai eu le même soucis avec Thunderbird, quand j'ai voulu partager ma boite sous windows et linux.

Bref, un script de ce genre marche pas ?:

Le FileReadline lis chaque ligne avec comme carractère de ligne: ( CHR(10) ou @LF )
FileWriteLine ajoute automatiquement @CRLF comme séparateur de ligne si il y a pas de @CR ou @LF à la fin

C'est pour ca que je traite la ligne avec StringStripCR et StringStripWS

Code : Tout sélectionner

$fileIn = FileOpen("test.txt", 0)
$fileOut = FileOpen("test.txt.out", 2)
; Check if file opened for reading OK
If $fileIn = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf
; Read in lines of text until the EOF is reached
While 1
    $line = FileReadLine($fileIn)
    If @error = -1 Then ExitLoop
    $line = StringStripCR($line)
    $line = StringStripWS($line, 3) ; Début et fin
    If $line = "" Then Continueloop
    FileWriteLine($fileOut, $line)
Wend

FileClose($fileIn)
FileClose($fileOut)
 
Edit:

J'ai ajouter le saut en cas de ligne vierge: If $line = "" Then Continueloop à toi de voir si il faut le laisser
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#18

Message par jchd »

L'éjection de _toutes_ les lignes vides n'est pas forcément correct !
En faisant ainsi, on ne sait pas si on est dans le cas "terminaison CRLF suivi de CR puis autre chose" ou "CRLF suivi de CRLF puis autre chose".
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#19

Message par mikell »

Heu autre chose, est-ce que traiter les lignes par "paquets" ne marcherait pas ?

Code : Tout sélectionner

$fileOut = FileOpen("test.txt.out", 1)
$n = 1

While 1
$fileIn = FileOpen("test.txt", 0)
For $i = $n to $n + 99
    $line = FileReadLine($fileIn, $i)
    If @error = -1 Then ExitLoop 2
    If StringInStr(StringRight($line, 3), @CR) Then StringReplace($line, @CR, "")
    If $line = "" Then Continueloop
    FileWriteLine($fileOut, $line)
Next
$n += 100
FileClose($fileIn)
Wend

FileClose($fileIn)
FileClose($fileOut)
Modifié en dernier par mikell le sam. 05 nov. 2011 17:53, modifié 1 fois.
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Supression de caractere dans gros fichier

#20

Message par Iste »

@jchd : Bah c'est une question que je me pose quand on me donne en réponse le nom d'une commande linux alors que je suis manifestement dans un environnement windows.
Apres, si il y a une implementation que je ne connais pas, tant mieux, mais il faudra quand meme que je passe par AutoIt pour d'autre raison (recherche des fichiers, log, test)

Sinon, comme la solution de "FileRead($hInpf, 2112)" ne consome pas beaucoup de mémoire, j'avais bien l'intention de noter si la chaine fini par un cr pour savoir que faire pour la prochaine.

Me faut juste le temps de m'y mettre, mais j'aurai vraiment bien aimé comprendre l'utilité des FileSetPos() dans le code que Tlem m'a retrouvé.

@GaRydelaMer : j'y ai pensé, mais je ne savais pas comment se comporterai FileReadLine() face a un @cr@cr@lf (une ligne ? deux ?) et si il me rapportait la fin de ligne..
J'aurai pu tester, mais comme dit, manque de temps ^^'

je viens de tester votre code donc, il fonction bien, a cela pret qu'il est extrêmement lent :s (surement du a l’écriture de chaque ligne séparément)
mais comme dit par jchd, je perd les ligne vide (pas moyen de savoir si la ligne contenais juste @cr ou @cr@lf)

Au passage, je me suis trompé au début, c'est bien des @cr@cr@lf que je cherche a changer en @cr@lf

edit :

@mikell je ne comprend pas bien ce que cela apporte, mais de toute facon, il me semble que l'utilisation de filereadligne pose probleme.

Sinon, voici un prototype de la fonction que je vais surement utiliser :
► Afficher le texte
si vous voyez des erreurs...
Signez ici
Répondre