[..] Supprimer des lignes dans un fichier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

[..] Supprimer des lignes dans un fichier

#1

Message par Vins83 »

Bonjour a tous..

voilà un probleme qui me paraissé bien simple,mais qui ne l'ai pas trop en faite pour moi novice que je suis..

j'ai un fichier nommé : DOSNET.INF

et je veux supprimer des lignes..

voila le contenu:

Code : Tout sélectionner

[Files]
d1,usetup.exe,system32\smss.exe
d1,ntdll.dll,system32\ntdll.dll


[Files]
d1,3dgarro.cur
d1,3dgmove.cur
d1,3dgnesw.cur
et je veux supprimer d1,3dgarro.cur.

J'ai essayer inidelete,mais sans réussir car il me supprime le premiers a chaque fois et si je veux renommer le premier,sa marche bien sur,mais je ne peux jamais remettre le nom initial vu qu'il existe déjà..

Quelqu'un aurait il une idée..

Merci
Avatar du membre
Voodoo
Niveau 6
Niveau 6
Messages : 298
Enregistré le : ven. 20 juil. 2007 20:45
Status : Hors ligne

#2

Message par Voodoo »

Peut-être ceci ?

Code : Tout sélectionner

#include <file.au3>
Dim $aRecords
If Not _FileReadToArray ( "DOSNET.inf" , $aRecords ) Then 
MsgBox ( 4096 , "Error" , " Error reading log to Array error:" & @error ) 
Exit
EndIf
For $x = 1 to $aRecords[0] 
if StringInStr ( $aRecords[$x] , "d1,3dgarro.cur" , 1 ) then _FileWriteToLine ( "DOSNET.inf" , $x , "" , 1 ) 
Next
Avatar du membre
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

#3

Message par Vins83 »

Merci pour ton aide,j'ai encore un leger souci,etant donné que je souhaite supprimer plusieurs lignes,j'ai rajouter tout mon blabla,mais bizarement,il m'a meme supprimer des lignes que je ne voullais pas bizar...
Avatar du membre
Voodoo
Niveau 6
Niveau 6
Messages : 298
Enregistré le : ven. 20 juil. 2007 20:45
Status : Hors ligne

#4

Message par Voodoo »

c'est sans doute un petit probléme du au stringinstr() que je ne trouve pass utile quand il faut rechercher exactement un mot. Si on chercher "Autoit" dans "Forum Autoit" il va trouvé une occurence.
Pour recherché une séquence de caractère définies voila ce que j'utilise:

Code : Tout sélectionner

Func strinstrg ( $string_ , $stringref_ ) 
$string_ = StringStripWS ( $string_ , 3 ) 
$stringref_ = StringStripWS ( $stringref_ , 3 ) 
If StringLen ( $string_ ) <> StringLen ( $stringref_ ) Then Return 0 
For $i = 0 To StringLen ( $string_ ) 
If StringLeft ( $string_ , $i ) <> StringLeft ( $stringref_ , $i ) Then Return 0 
Next
Return 1
EndFunc ; == >strinstrg
Evidement elle n'est pas case sensitive !
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#5

Message par ani »

Ce fichier est-il d'origine (dosnet.inf)? ou c'est un fichier de t"a conception ?

dans le cas ou le fichier serait d'origine,
Mon observation,
je ferais plutôt ceux-ci,
  • Création d'un tableau qui englobera tout les curseurs ou élèment à ne pas prendre en compte.
  • Le Fichier (dosnet).
Avec c'est deux élément = (dosnet - tableau) = donnera la création d'un nouveau fichier (dosnet.inf) au cas ou le fichier dosnet se trouverai sur un cd, ou protéger. (déjà pour une raison y a trop de blanc dans ce fichier)

Le code que tu m'a fait parvenir, y a des curseurs, évidement il manque dans la recherche le " d1, " , c'est pour çà que çà fonctionne pas et qu'il efface des truc non séléctionné ;)

Donc le mieux sera de creer une fonction a cette effet comme pour le eventsource de ton projet, dans la boucle while tu indique exemple _del()

La je demande au expert , dans l'exemple de fonction pour vins, on a un fichier (dosnet.inf) et une liste d'element a ne pas prendre en compte (erf çà je viend de le dire, me répéte :p ),, donc je me demande si ceux-ci serai juste...

func _del(byref $fichier, $element)


ps: j'ai toujours = (l'échec connection ...pas d'msn hihihi) grrrrrr çà m'enerve
Avatar du membre
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

Re: [..] Supprimer des lignes dans un fichier

#6

Message par Vins83 »

Je réouvre le post aprés 8 mois presque lol,les versions proposées avant ne me convenait pas,si un fichier était trop grand,il supprimait trop de texte..

Voilà ce que j'ai fais,il me reste plus qu'à supprimer $line

Code : Tout sélectionner

$file = FileOpen("shl_img.inf", 0)

While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $resultat = StringCompare($line,'"%MOON_JPG_NAME%",moon.jpg',0)
    If $resultat == 0 Then
        ; c'est là qu'il me manque un petit truc help..
        ExitLoop
        EndIf
Wend

FileClose($file)
merci de votre aide
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Supprimer des lignes dans un fichier

#7

Message par sylvanie »

Salut Vins,
Perso, je créerai un autre fichier, puis je recopie dedans la ligne en cours si ça ne matche pas avec ton teste, et sinon je passe à la suivante sans recopier.
Après je supprime l'originale (fais un backup avant ^^) et je renomme le nouveau avec l'ancien nom.

Sinon le fichier fait jusqu'à 2 ou 3 Mo on peut tout buffeuriser et sortir mon artillerie préférée :

Code : Tout sélectionner

$fic_contenu=FileRead("input_vins.txt")
FileWrite("input_vins2.txt",StringRegExpReplace(fic_contenu,"d1,3dgarro\.cur\r*\n*",""))
;todo : la suppression et renommage
 
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Supprimer des lignes dans un fichier

#8

Message par Tlem »

Pourquoi ne pas utilisez tout simplement _ReplaceStringInFile.

Je viens de mettre dans la section 'Les Fonctions' un UDF qui permet de faire plusieurs remplacement dans un fichier qui utilise _ReplaceStringInFile :
http://www.autoitscript.fr/forum/viewto ... =21&t=1076
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
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Supprimer des lignes dans un fichier

#9

Message par sylvanie »

parce que qui n'aime pas les expression régulières :mrgreen: :wink:
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Supprimer des lignes dans un fichier

#10

Message par Tlem »

Ouais je sais, il va falloir que je m'y mette sérieusement.
Hé bien ça tombe bien, tu pourrait nous simplifier cette fonction : http://www.autoitscript.fr/forum/viewto ... =21&t=1072
:P
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
Tragan
Niveau 3
Niveau 3
Messages : 38
Enregistré le : jeu. 01 nov. 2007 23:51
Localisation : Le monde et ses environs...
Status : Hors ligne

Re: [..] Supprimer des lignes dans un fichier

#11

Message par Tragan »

Salut à tous !

Je ne sais pas si c'est exactement ce que recherche Vins83...

Mais voici la méthode que j'utilise pour supprimer des lignes d'un fichier

Code : Tout sélectionner

[color=#008040][b];[u]Exemple :[/u] Supprimer d'un Fichier toutes les lignes vides et celles commençant par un ";"[/b][/color]

[color=#008040];Compter le Nombre de lignes du fichier source[/color]
[color=#008040];pas besoin de #include <file.au3>[/color]
$f="[color=#0040FF][i]chemin vers le fichier source[/i][/color]"
$sf=FileGetSize($f)-1
$nl=StringLen(StringAddCR(FileRead($f,$sf)))-$sf+1
[color=#008040];$nl= Nombre de lignes du fichier[/color]



[color=#008040];on va créer un deuxième fichier puis y copier les lignes que l'on veut garder[/color]

$f2=FileOpen("[color=#0040FF][i]chemin vers le fichier modifié[/i][/color]",9)
[color=#008040];9=1+8 1=Mode écriture et 8=Crée le fichier s'il n'existe pas[/color]
For  $i=1 To $nl
[color=#008040] ;Boucle de la ligne 1 à la ligne $nl du Fichier Source  $i=indice de boucle[/color] 
$l=FileReadLine($f,$i)
[color=#008040];lit la ligne n° $i[/color]

[color=#008040];Corps du Test [i](vous pouvez mettre le test que vous voulez)[/i][/color]
$1=StringLeft($l,1)
[color=#008040];Donne le 1er caractère de cette ligne[/color]
If ($1=""Or $1=";")=0 Then
[color=#008040];Test si ce n'est ni une ligne vide ni un ";"[/color]

FileWriteLine($f2,$l)
[color=#008040];Si oui, écrit la ligne dans le fichier modifé[/color]
EndIf
Next
Et voilà, un Fichier modifié, sans lignes vides, ni lignes commençant par un ";"

Code : Tout sélectionner

$f="[color=#0040FF][i]chemin vers le fichier source[/i][/color]"
$sf=FileGetSize($f)-1
$nl=StringLen(StringAddCR(FileRead($f,$sf)))-$sf+1 
$f2=FileOpen("[color=#0040FF][i]chemin vers le fichier modifié[/i][/color]",9)
For  $i=1 To $nl
$l=FileReadLine($f,$i)
$1=StringLeft($l,1)
If ($1=""Or $1=";")=0 Then 
FileWriteLine($f2,$l)
EndIf
Next
Marche parfaitement avec les fichiers *.txt ,*.ini et certains fichiers ressources...
(pas testé avec les autres... :? )

Voilà, si cela peu servir à quelqu'un...

Accepte toutes remarques, mais surtout les bonnes ! :lol:

Allez, de bonnes suppressions de lignes à tous et...

Bon Vent !

Tragan
Bon Vent !

Tragan
Plus j'apprends, plus je prends la mesure de ce que je ne sais pas... (et personnellement y-a du boulot ! :mrgreen: )
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

Re: [..] Supprimer des lignes dans un fichier

#12

Message par jbnh »

Code : Tout sélectionner

#include <file.au3>
 
Dim $array
;---------------A COMPLETER--------
Dim $pseudo = "salut"
$filename = 'test.txt'
$filename2 = 'clean.txt'
;------------------------------------------
$file = FileOpen($filename, 0)
$read = FileRead($file)
$len = StringLen($pseudo)

_FileReadToArray($filename, $array)
For $X = 1 to $Array[0]
  
       $var = FileReadLine($filename, $X)
       $result = StringLeft($var, $len)
       
        If $pseudo = $result Then       
        else
        FileWrite($filename2, $var & @CRLF)     
        Endif             
Next
Même chose pour un mot en début de phrase.

Ps: ça marche pas si je met If not $pseudo = $result bizarrement.
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Supprimer des lignes dans un fichier

#13

Message par Tlem »

Tragan a écrit :Accepte toutes remarques, mais surtout les bonnes !
Avec plaisir. ;)

- Première remarque :
Dans votre script vous faites une première lecture du fichier pour en connaitre le nombre de ligne !
Mais en réalité vous n'avez pas besoin d'une telle chose puisque vous pouvez utiliser la macro @error dans votre boucle.

Code : Tout sélectionner

While 1
    $l=FileReadLine($f)
    If @error = -1 Then ExitLoop
    $1=StringLeft($l,1)
    If ($1=""Or $1=";")=0 Then
        FileWriteLine($f2,$l)
    EndIf
Wend
- Deuxième remarque :
Dans votre boucle, vous faites à chaque itération une lecture du fichier source puis selon le cas une écriture dans le fichier de destination !!!
Il faut savoir, que chaque opération de lecture et d'écriture comme vous le faites implique des tas de choses, et consomme énormément de ressource pour peut de chose.
Si vous devez faire de multiples lecture/écriture dans des fichiers, prenez l'habitude d'utiliser le handle de ces fichiers en utilisant un FileOpen en début d'opération.
Une autre solution consiste à lire le fichier dans une variable puis de faire le traitement en mémoire et enfin d'écrire le résultat (ce qui nous donne une lecture et une écriture) => quel gain de temps).
Pour illustrer mes propos, voici ce qui me semble être une bonne solution de codage :

Code : Tout sélectionner

Dim $Res, $f = "nigel@mcnie.name.txt"
$fFile = FileRead($f)  ; On lit le fichier dans une variable.

$aFile = StringSplit($fFile, @CRLF, 1)  ; Mise en tableau du fichier.

; On récupère toutes les lignes autre que vide ou commancant par ; dans une variable.
For $i = 1 to $aFile[0]
    If Not ($aFile[$i] = "" Or StringLeft($aFile[$i],1) = ";") Then
        $Res &= $aFile[$i] & @CRLF
    EndIf
Next

FileMove($f, $f & ".bak") ; On renomme le fichier source en *.bak
FileWrite($f, $Res) ; on ré-écrit le fichier source filtré.
J'ai fait exprès de coder sans Include, sinon le script peut être simplifier avec certains UDF tel que _FileReadToArray par exemple.
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
Tragan
Niveau 3
Niveau 3
Messages : 38
Enregistré le : jeu. 01 nov. 2007 23:51
Localisation : Le monde et ses environs...
Status : Hors ligne

Re: [..] Supprimer des lignes dans un fichier

#14

Message par Tragan »

Salut à vous jbnh et Tlem !

Et un grand merci pour vos réponses...
Dans votre script vous faites une première lecture du fichier pour en connaitre le nombre de ligne !
Mais en réalité vous n'avez pas besoin d'une telle chose puisque vous pouvez utiliser la macro @error dans votre boucle.
Effectivement, je connaissais et utilise parfois cette macro, mais là c'était pour montrer ma façon de compter les lignes d'un fichier...
Une autre solution consiste à lire le fichier dans une variable puis de faire le traitement en mémoire et enfin d'écrire le résultat (ce qui nous donne une lecture et une écriture) => quel gain de temps).
Alors là !, plus qu'un grand merci !! (Testé sur un fichier de 2564 lignes)
Il me manquait cette phrase Magique : faire le traitement en mémoire

Je vais devoir revoir beaucoup de mes scripts... :(

Plus j'apprends, plus je prends la mesure de ce que je ne sais pas..., et... y a du boulot ! :lol:

Encore merci et...

Bon Vent !

Tragan
Bon Vent !

Tragan
Plus j'apprends, plus je prends la mesure de ce que je ne sais pas... (et personnellement y-a du boulot ! :mrgreen: )
Répondre