begin process at 2012 02 08 10:33:24
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Texte

 > CONVERTIR UN FICHIER TEXTE UNIX EN FICHIER TEXTE WINDOWS ET VICE ET VERSA

CONVERTIR UN FICHIER TEXTE UNIX EN FICHIER TEXTE WINDOWS ET VICE ET VERSA


 Information sur la source

Note :
Aucune note
Catégorie :Texte Niveau :Débutant Date de création :31/08/2004 Date de mise à jour :31/08/2004 21:48:30 Vu :14 556

Auteur : gbegreg

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

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

  • 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;
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;



 Historique

31 août 2004 21:48:32 :
Correction de l'orthographe.....

 Sources du même auteur

Source avec Zip Source avec une capture METTRE DES CELLULES EN COULEURS DANS UN TLISTVIEW (STYLE= VS...
Source avec Zip COMPOSANT PERMETTANT DE TRIER LE CONTENU D'UN FICHIER TEXTE

 Sources de la même categorie

Source avec Zip Source avec une capture TABLEAU INFO SAVE INI par quentinix
Source avec Zip TIBWORD: EDITEUR ORIENTE LANGUE TIBÉTAINE par fredelem
Source avec Zip Source avec une capture POSTIT INFOS par dubois77
Source avec Zip Source avec une capture STREAM STRINGWRITER... UNE MICRO-LIBRAIRIE POUR ÉCRIRE DES C... par LaDentDeLait
Source avec Zip COMBINAISONS DE STRINGS par askil2000

Commentaires et avis

Commentaire de BruNews le 01/09/2004 00:33:25 administrateur CS

1 acces disk par octet en lecture et 1 autre en ecriture, beaucoup trop lent. Essaie d'aspirer au moins 32 Ko en 1 passe et ensuite tu traites le buffer memoire que tu retamponneras aussi en 1 seule passe.

Commentaire de Delphiprog le 03/09/2004 16:17:01 administrateur CS

Je suggère une méthode un peu plus performante au travers de ces deux routines :

procedure UnixToDos(const FileName: TFileName);
begin
  if FileExists(FileName) then
    with TStringList.Create do
    try
      //Les sauts de ligne sont automatiquement convertis
      //en CR + LF
      LoadFromFile(FileName);
      //on réécrit le fichier aussitôt
      SaveToFile(FileName);
    finally
      Free;
    end;
end;

procedure DosToUnix(const FileName: TFileName);
var
  fs: TFileStream;
  ss: TStringStream;
  i: integer;
begin
  if FileExists(FileName) then
  begin
    //le flux de fichier est ouvert en Lecture + Ecriture !
    fs := TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
    try
      ss := TStringStream.Create('');
      try
         //Copie le flux de fichier dans le flux chaine
         ss.CopyFrom(fs, fs.Size);
         //Réinitialisation des positions des 2 flux
         ss.Seek(0, soFromBeginning);
         fs.Seek(0, soFromBeginning);

         for i:= 1 to ss.Size do
           if ss.DataString[i] <> #13 then
             fs.WriteBuffer(ss.DataString[i], 1);

      finally
        FreeAndNil(ss);
      end; {try..finally}

    finally
      FreeAndNil(fs);
    end; {try..finally}

  end;
end;

On appréciera la simplification de la conversion UnixToDos...
Faites gaffe aux radars, ça va très vite ~:)

On peut encore améliorer le temps de traitement de la procédure DosToUnix en traitant et en écrivant des blocs de chaines. Malgré tout, les opérations de lecture se font en une seule passe au lieu de lire caractère par caractère dans le fichier.
Si cela intéresse quelqu'un, il n'y a qu'à le demander.

Commentaire de gbegreg le 04/09/2004 11:44:39

Merci pour vos remarques très instructives. C'est vrai que les essais que j'ai réalisés ne concernaient que des petits fichiers. D'où aucune optimisation n'avait été faite.

Mais l'objectif était de transférer un grand nombre de sources d'un OS à l'autre. Je suivrai vos conseils pour améliorer mes fonctions.

Je vous remercie à nouveau.

Commentaire de sisi231 le 30/03/2007 19:33:49

Ta procédure est compliquée et laisse parfois des caractères 10 et 13
qui s'affichent en rectangles sous le bloc-notes il y a beaucoup plus simple :

procedure Unix2Dos(nomfic: string);
var
l:tstringlist;
begin
  l:=tstringlist.cretae;
  l.LoadFromFile(nomfic);
  l.Text:=ansireplacestr(l.Text,#10,#13#10);
  l.SaveToFile(nomfic);
  l.free;
end;

NB : Il faut ajouter StrUtils à la clause uses.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,089 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales