Supprimer 5 lignes en debut de fichier ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Yves Rouquier
Messages : 40
Inscription : mar. 23/mars/2004 10:23

Supprimer 5 lignes en debut de fichier ?

Message par Yves Rouquier »

Bonjour !
tout est dans le titre .
j'ais une methode qui consiste a lire les lignes une par une
et de les ecrires vers un autre fichier sauf pour les 5 premieres !
Mais ces un peut lourd !
Merci !
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

tu peux essayer quelque chose comme ca:

Code : Tout sélectionner

If ReadFile(0, ..)

  For k=1 to 5
    ReadString() ; Saute les 5 premieres lignes
  Next

  TailleRestante = Lof()-Loc()
  *Buffer = AllocateMemory(0, TailleRestante)
  ReadData(*Buffer, TailleRestante)
  
  ; Utiliser WriteData() sur l'autre fichier

  CloseFile(0)
EndIf

brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour

Comme je suis assez adepte de la vitesse et de la souplesse je te propose de passer par un block mémoire.

Dans un premier temps le petit programme suivant va créer un fichier de 1000 enregistrements séparés par une combinaison quelconque de caractère Ascii appellée ici "FinDeLigne" (on prendra ici le codage normal d'une fin de ligne).
J'ai admis qu'un enregistement ne ferait jamais plus de 1000 caractères ce qui semble assez peu vraissemblable mais il n'est pas impossible d'augmenter ce paramètre.

Code : Tout sélectionner

CreateFile(#1,"c:\exemple.txt")
FinDeLigne.s=Chr(13)+Chr(10)
For n=1 To 1000
  WriteString("ligne " +Str(n)+FinDeLigne)
Next
CloseFile(#1)
Dans le code qui suit on ouvre le fichier précedement créer pour l'exemple

Code : Tout sélectionner

;On défini le nombre de lignes à éffacer
NbLignesAEffacer.l = 5

;On défini le séparateur d'enregistrement
FinDeLigne.s=Chr(13)+Chr(10)

;On charge en mémoire l'intégralité du fichier
res=OpenFile(#1,"c:\exemple.txt")
*mem=AllocateMemory(#2,Lof())
ReadData(*mem,Lof())
CloseFile(#1)

Debug PeekS(*mem,1000)

;On déplace le pointeur à la Xième occurence de "FinDeLigne" définie ici par "NbLignesAEffacer".
For x=1 To NbLignesAEffacer
  txt.s = PeekS(*mem,10000)
  pos=FindString(txt,FinDeLigne,1)
  *mem + pos + 1
Next

Debug PeekS(*mem,1000)

;On écrase le précedent fichier par un vide
CreateFile(#1,"c:\exemple.txt")

;On sauvegarde le bloc mémoire dans le fichier vide.
WriteData(*mem,MemoryStringLength(*mem))

;On ferme le fichier modidier !
CloseFile(#1)

;On libère la mémoire
FreeMemory(#2)
Le tour est joué et pour faire plus rapide ...

Les deux lignes "Debug" ne sont là que pour visionner rapidement le bon déroulement du programme !

En bricolant un peu ce code on se rendra compte qu'il est ainsi possible de supprimer n'importe quel nombre de ligne à nimporte quelle position dans le fichier !
Dernière modification par brossden le mar. 23/mars/2004 15:45, modifié 2 fois.
Denis

Bonne Jounée à tous
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Voilà le code torturé sous forme de procédure mais sans commentaires, je pense qu'avec un peu de réflexion ils ne seront pas nécessaires.

Code : Tout sélectionner


Procedure SupLigne(Fichier.s,NbLignesASauter.l,NbLignesAEffacer.l,FinDeLigne.s)
  res=OpenFile(#1,Fichier)
  *mem=AllocateMemory(#2,Lof())
  ReadData(*mem,Lof())
  CloseFile(#1)
  CreateFile(#1,Fichier)
  FinSaut=0
  Debug NbLignesASauter
  *mem1=*mem
  For x=1 To NbLignesASauter
    txt.s = PeekS(*mem1,1000)
    pos=FindString(txt,FinDeLigne,FinSaut+1)
    *mem1 + pos +1
  Next
  FinSaut.l = *mem1 - *mem
  For x=1 To NbLignesAEffacer
    txt.s = PeekS(*mem1,1000)
    pos=FindString(txt,FinDeLigne,1)
    *mem1 + pos + 1
  Next
  Debug PeekS(*mem,FinSaut)
  WriteData(*mem,FinSaut)
  WriteData(*mem1,MemoryStringLength(*mem1))
  CloseFile(#1)
  FreeMemory(#2)
EndProcedure


SupLigne("c:\exemple.txt", 10, 15, Chr(13)+Chr(10))

End

Denis

Bonne Jounée à tous
Yves Rouquier
Messages : 40
Inscription : mar. 23/mars/2004 10:23

Message par Yves Rouquier »

Merci beaucoup !
la procedure fonctionne tres bien. :D
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

C'est la moindre des chose !
lol :wink:
Denis

Bonne Jounée à tous
Répondre