Convertir un fichier texte unix en fichier texte windows et vice et versa

Contenu du snippet

Si vous jonglez entre les systèmes Unix et Windows, vous remarquerez que les caractères "retour chariot" et "saut de ligne" ne sont pas correctement traduits.

Voici le source de deux fonctions prenant en paramètre le nom comlet du fichier à convertir (chemin + nom du fichier) :

- la fonction ConvertirUnixVersDos convertit un fichier texte issu du monde Unix en fichier texte pour Dos/Windows
- la fonction ConvertirDosVersUnix convertit un fichier texte issu de Windows vers Unix.

Source / Exemple :


procedure TForm1.ConvertirUnixVersDos(nomfic: string);
var
   f,s:textfile;
   ch, ch2, chprec:char;
   cr,lf,cr2,lf2 :boolean;

begin
   // Assignation du fichier en entrée
   assignfile(f,nomfic);
   reset(f);
   // Assignation du fichier temporaire résultat (situé dans le répertoire de l'application Delphi et porte le nom temp.txt
   assignfile(s,Extractfilepath(application.exename)+'\temp.txt');
   rewrite(s);

   // Initialisation du caractère précédent
   chprec :=#0;

   // Tant qu'on est pas à la fin du fichier d'entrée
   while not(eof(f)) do
   begin
      // Lecture du fichier en entrée caractère par caractère et stockage de celui ci dans la variable ch
      read(f,ch);

     // si le caractère lu est "saut de ligne"
      if ch = #13 then
      begin
         // on lit le caractère suivant du fichier entrée    
         read(f,ch2);
         // écriture du caractère ch dans le fichier de sortie
         write(s,ch);
         // si le caractère ch2 est différent de "retour chariot" alors on ajute un caractère "retour chariot" dans le fichier de sortie
         if ch2 <> #10 then write(s,#10);
         // Ecriture du caractère ch2 dans le fichier de sortie
         write(s,ch2);
         // stockage du dernier caractère lu dans chprec
         chprec := ch2;
      end
      else
      begin
         // Si le caractère lu est "retour chariot"
         if ch = #10 then
         begin
            // si le caractère précédent était "saut de ligne" on écrit ch
            if chprec = #13 then write(s,ch)
            else
            begin
               // lecture du caractère suivant
               read(f,ch2);
               // si le caractère suivant est "saut de ligne"
               if ch2 = #13 then
               begin
                  // il faut inverser l'ordre de ch et de ch2 dans le fichier de sortie
                  write(s,ch2);
                  write(s,ch);
               end
               else
               begin
                  // sinon, on ajout un "saut de ligne" et on écrit les caractères ch et ch2.
                  write(s,#13);
                  write(s,ch);
                  write(s,ch2);
               end;
            end;
         end
         // cas d'un caractère <> de "retour chariot" et de "saut de ligne", on écrit tout simplement le caractère dans le fichier de sortie.
         else write(s,ch);

         chprec := ch;
      end;
   end;

   // fermeture des fichiers
   closefile(s);
   closefile(f);

   // Suppression du fichier en entrée
   deletefile(nomfic);
   // Renommage du fichier temporaire en nomfic
   renamefile(Extractfilepath(application.exename)+'\temp.txt',nomfic);
end;

// même chose en plus simple : il suffit de supprimer les caractères #13 du fichier en entrée.
procedure TForm1.ConvertirDosVersUnix(nomfic: string);
var
   f,s:textfile;
   ch,ch2:char;
begin
   assignfile(f,nomfic);
   reset(f);
   assignfile(s,Extractfilepath(application.exename)+'\temp.txt');
   rewrite(s);

   while not(eof(f)) do
   begin
      read(f,ch);
      if ch = #13 then read(f,ch);
      write(s,ch);
   end;

   closefile(f);
   closefile(s);

   deletefile(nomfic);
   renamefile(Extractfilepath(application.exename)+'\temp.txt',nomfic);
end;

A voir également

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.