Lire & Supprimer un caractère dans un fichier [Résolu]

Encore1ben 68 Messages postés jeudi 19 septembre 2002Date d'inscription 22 février 2008 Dernière intervention - 10 oct. 2006 à 15:16 - Dernière réponse : Encore1ben 68 Messages postés jeudi 19 septembre 2002Date d'inscription 22 février 2008 Dernière intervention
- 12 oct. 2006 à 01:40
Bonjour,

J'ai repris le code source de mon prédécesseur concernant une application qui est censé formater un fichier texte en un autre. Malheureusement, il ne fonctionne pas et son code est loin d'être clair.

Y'aurait il quelqu'un qui pourrait me résumer en  2 lignes, comment faire pour lire une ligne d'un fichier texte, caractères par caractères à partir d'un certain caractère, pour enfin, les remplacer ou les supprimer ?

En plus concret, j'ai un fichier avec des lignes de 20 caractères. Je souhaiterais tester les caractères à partir du 10ème caractère de chaque ligne, pour vérifier si c'est un "0" et si c'est le cas, remplacer le zéro par un autre caractère, et ce jusqu'à arriver à un caractère qui soit différent de "0".

Exemple ( Ligne X de mon fichier ):
ABCDEFGHIJ+000012036
Je voudrais lire à partir de "+" et remplacer tous les "0" jusqu'au chiffre "12036" !

J'espère avoir été clair et merci infiniment d'avance !

Ps: j'ai bien fouillé sur le site, mais je n'arrive pas à appliquer les différentes solutions à mon cas. Y'a un truc que je dois pas faire correctement !
-----------------------------------------------------------

"No Comment ! Just Act..."
Afficher la suite 

9 réponses

Répondre au sujet
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 11 oct. 2006 à 12:29
+3
Utile
Salut Codial
Alors, comme ça on ne connait pas les TStringList ???

Solution : passer par une chaine intermédiaire (ici nommée s):
var
  i, j, X: Integer;
  Sys: TStringList;
  s: string;
begin
  Sys :=  TStringList.Create;
  try
    Sys.LoadFromFile('C:\temp.dat');
     for  i : = 0to Sys.Count - 1do
    begin
      //récupère la valeur de la chaine examinée
      s :=  Sys.Strings[i];
      //on travaille avec la chaine
       for  j : = 49to Length(s) do
        if s[j] =  '0'then
          s[j] := '_';

      Sys.Strings[i] := s;
     end ;
    Sys.SaveToFile('C:\copy.dat');
  finally
    Sys.Free;  // < = NE PAS OUBLIER !!!
  end;
end;


May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
Encore1ben 68 Messages postés jeudi 19 septembre 2002Date d'inscription 22 février 2008 Dernière intervention - 12 oct. 2006 à 01:40
+3
Utile
Merci à tous pour votre aide ! Tout fonctionne parfaitement... C'est une bonne réponse collégialle !

Enfin, bref, merci à vous et longue vie à ce site et à sa communauté !!! (je fais pas mon lèche cul, mais je sais reconnaître un effort, surtout quand il me permet d'avancer aussi rapidement et aussi clairement !)

-----------------------------------------------------------

"No Comment ! Just Act..."
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Encore1ben
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 10 oct. 2006 à 16:12
0
Utile
Salut

pourrais-tu nous donner le bout de code qui est supposé faire ce que tu souhaites !

ce sera encore plus facile pour nous de te donner une réponse.

Il y a plusieurs façon de procéder et en fonction de ce qui est déjà fait la correction peut être très simple

 
@+
Cirec

Commenter la réponse de Cirec
Utilisateur anonyme - 10 oct. 2006 à 17:30
0
Utile
Salut,

Si je peux me permettre : si tu as un fichier texte volumineux, ce genre de technique de lire caractère par caractère va prendre beaucoup de temps. Si tu fais ca avec l'Univeralis, tu as intéret à être patient.

Il n'y a pas possibilité de scruter qu'une partie du fichier ?
Commenter la réponse de Utilisateur anonyme
Encore1ben 68 Messages postés jeudi 19 septembre 2002Date d'inscription 22 février 2008 Dernière intervention - 10 oct. 2006 à 17:30
0
Utile
Salut,

Tout d'abord, un grand merci pour ta réponse et pour ton eventuel aide futur ou non !

Concernant le code, je ne suis pas sûr que cela t'aide beaucoup mais je vais quand même te le copier ci dessous. La fonction correspond à un decryptage de fichier qu'il faut ensuite mettre correctement en forme d'ou ma demande...

En fait, je voudrais formater mon texte soit dans cette procédure, soit après peu importe... Mais j'ai déjà du mal à décrypter ce que mon collègue précédent à fait !!!

procedure decryptage_fichier(nom_fichier, clef : string);
var i,j,t : integer;
    f_in, f_out : textfile;
    c : array of byte;
    ligne, retour : string;
    fichier : array of string;
begin
// Préparation du code de premutation pour le decryptage
setlength(c,length(clef)+1);
t:=0;
for j:=0 to 255 do
    for i:=1 to length(clef) do
        if clef[I]=chr(j) then
           begin
                inc(t);
                c[t]:=i;
           end;


assignfile(f_in,nom_fichier);
reset(f_in);


setlength(fichier,0);
t:=0;
while ((not eof(f_in)) and (t=0)) do
      begin
           readln(f_in,ligne);
           if ligne='/DOC ()' then t:=1;
      end;


while not eof(f_in) do
      begin
           readln(f_in,ligne);
           if ligne<>'/DOC ' then
            begin
              retour:='';
              for i:=1 to length(ligne) do retour:=retour+' ';
              for i:=0 to (length(ligne) div length(clef))-1 do
                  for j:=1 to length(clef) do
                      begin
                           if ligne[j+i*length(clef)]=']' then ligne[j+i*length(clef)]:=' ';
                           retour[c[j]+i*length(clef)]:=ligne[j+i*length(clef)];
                      end;
              setlength(fichier,high(fichier)+2);
              fichier[high(fichier)]:=retour;
            end;
      end;
closefile(f_in);


assignfile(f_out,nom_fichier);
rewrite(f_out);


for i:=0 to high(fichier) do
    writeln(f_out,fichier[i]);


closefile(f_out);


setlength(fichier,0);
end;

Merci d'avance,

-----------------------------------------------------------

"No Comment ! Just Act..."
Commenter la réponse de Encore1ben
cs_neko 135 Messages postés jeudi 14 août 2003Date d'inscription 12 octobre 2006 Dernière intervention - 10 oct. 2006 à 19:40
0
Utile
Déjà la personne qui a écrit ça semble bosser sur les fichiers directement
honnètement il vau mieu bosser en mémoire ( via des TStringList )
ou si ce sont des gros fichiers utiliser des Tfilestream.

var i,j,t : integer;
    f_in, f_out : textfile;
    c : array of byte;
    ligne, retour : string;
    fichier : array of string; //Il vau mieu utiliser un TStringList

setlength(c,length(clef)+1);
t:=0;
for j:=0 to 255 do
    for i:=1 to length(clef) do
        if clef[I]=chr(j) then
           begin
                inc(t);
                c[t]:=i;
           end;
Ce code tel quel est étrange, en gros il trie la clé par ordre alphabétque en stockant les indices
genre si la clé est "DELPHIFR"
c sera un tableau avec dedans les valeurs: 2,1,7,5,6,3,4,8
a savoir qu'il initialise un tableau de longueur N+1 indexé de 0 à N ( avec N=longueur de la clé )
mais qu'il commenceà l'indice 1... bon

assignfile(f_in,nom_fichier);
reset(f_in);

t:=0;
while ((not eof(f_in)) and (t=0)) do
      begin
           readln(f_in,ligne);
           if ligne='/DOC ()' then t:=1;
      end;

Recherche de la ligne '/DOC ()' ( je suppose que c'est ce qui indique le début du cryptage )

setlength(fichier,0);
//Debut du cryptage ( à la ligne juste après /DOC() )
while not eof(f_in) do
      begin
           readln(f_in,ligne);
           if ligne<>'/DOC ' then
            begin
              retour:='';
              for i:=1 to length(ligne) do retour:=retour+' ';
              //Creation d'une chaine remplie de N espaces avec N=longueur de la chaine lign
              //Equivalent à: SentLength(Retour, Length(Ligne)); FilleChar(Retour, Length(Ligne), ' ');

              for i:=0 to (length(ligne) div length(clef))-1 do
                  for j:=1 to length(clef) do
                      begin
                           if ligne[j+i*length(clef)]=']' then ligne[j+i*length(clef)]:=' ';
                           //On Remplace les caractères ']' par un espace

                           retour[c[j]+i*length(clef)]:=ligne[j+i*length(clef)];
                           //Change la position des lettres en fonction de la clé
                      end;
              setlength(fichier,high(fichier)+2); //Rejoute 1 ligne au tableau de string Fichier
              fichier[high(fichier)]:=retour;     //Ajoute la ligne cryptée au tableau
              //Avec un stinglist il aurait suffit de faire Add ^^
            end;
      end;
closefile(f_in);

a noter que l'algo continue de crypter le fichier après le /DOC s'il reste des lignes après

assignfile(f_out,nom_fichier);
rewrite(f_out);
for i:=0 to high(fichier) do
    writeln(f_out,fichier[i]);
closefile(f_out);

remplace le fichier par le fichier crypté

En plus concret, j'ai un fichier avec des lignes de 20 caractères. Je
souhaiterais tester les caractères à partir du 10ème caractère de
chaque ligne, pour vérifier si c'est un "0" et si c'est le cas,
remplacer le zéro par un autre caractère, et ce jusqu'à arriver à un
caractère qui soit différent de "0".
Var
    i, j: Integer;
    S: TStringList;
Begin
    S.LoadFromFile(Nom_Fichier); //Chargement du fichier
    For i:= 0 To S.Count-1 Do //Pour chaque ligne
       For j:=10 To Length(S.Strings[i]) Do //Pour chaque caractère au dessus du 10ième
          if S.Strings[i][j]='0' Then
             S.Strings[i][j]:=autre_caractère;
    S.SaveToFile(Nom_Fichier); //Sauvegarde
End;

Mais je ne vous pas en quoi ceci a a voir avec le code précédent

bouh
Commenter la réponse de cs_neko
Encore1ben 68 Messages postés jeudi 19 septembre 2002Date d'inscription 22 février 2008 Dernière intervention - 11 oct. 2006 à 11:23
0
Utile
Tout d'abord, un grand MERCI pour ta réponse.. Elle est très claire et bien détaillée, tu as dû bien te faire chier pour la faire... Donc, merci infiniment !

Je suis en train de reprendre le code, en utilisant plutôt les stringlist que je ne connaissais pas. J'ai donc découvert pas mal de chose comme la possibilité de trier ou d'insérer...

Par contre, je vais abuser de toi, une dernière fois, car j'ai un petit soucis avec mon insertion dans mon tableau, car delphi m'indique 'Left side cannot be assigned' pour la ligne en gras du code ci dessous...

Var
    i, j, X: Integer;
    Sys: TStringList;
Begin
    Sys:=TStringList.Create;
    Sys.LoadFromFile('C:\temp.dat'); 
       For i:= 0 To Sys.Count-1 Do
          For j:=49 To Length(Sys.Strings[i]) Do 
                if Sys.Strings[i][j]='0' Then
                begin
                   Sys.Strings[i][j]:='_'; <<<< Cette fonction n'est pas reconnue !
                end;
    Sys.SaveToFile('C:\copy.dat');
end;

Aurais tu une idée ??? J'ai essayé avec un Insert mais le problème, c'est que je ne peux le faire que sur une ligne...

Désolé d'abuser encore de ton temps et merci encore !

Chapeau bas l'ami !

-----------------------------------------------------------

"No Comment ! Just Act..."
Commenter la réponse de Encore1ben
Encore1ben 68 Messages postés jeudi 19 septembre 2002Date d'inscription 22 février 2008 Dernière intervention - 11 oct. 2006 à 12:07
0
Utile
Non, non, le fichier n'est pas volumineux ! A tout casser, il doit faire 30 ko, avec une petite centaine de ligne de 60 caractères chacunes ! Pas de quoi casser 3 pattes à un canard quoi...

-----------------------------------------------------------

"No Comment ! Just Act..."
Commenter la réponse de Encore1ben
Utilisateur anonyme - 11 oct. 2006 à 20:30
0
Utile
Si je peux me permettre : la technique du TStringList ne fonctionne que pour les fichiers de petite taille : plus, il faut ruser.
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.