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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 1 sept. 2004 à 00:33
sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 - 30 mars 2007 à 19:33
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25842-convertir-un-fichier-texte-unix-en-fichier-texte-windows-et-vice-et-versa

sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 5
30 mars 2007 à 19:33
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.
gbegreg Messages postés 9 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 1 mars 2012
4 sept. 2004 à 11:44
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.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
3 sept. 2004 à 16:17
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.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 sept. 2004 à 00:33
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.
Rejoignez-nous