Changer l'ordre des lignes dans un fichier texte

Résolu
Signaler
Messages postés
5
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
30 avril 2008
-
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
-
Bonjour à toutes et à tous,

J'ai un petit problème delphien!!

J'ai crée un fichier text dans lequel j'ai un certain nombre de ligne.
Je voudrais changer l'ordre des lignes pour qu'elles apparaissent dans un ordre aléatoire dans un autre fichier fichier texte.

Si vous avez une petite idée.
Merci a vous

pyo

9 réponses

Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
5
bonjour,
si cela est possible , importe ton fichier dans un TstringList.
tu en créé un deuxième vide qui sera ta destination.

tu prends un chiffre au hasard ente 0 et tstringListSource.count-1, tu l'ajoute dans ton tstringList de destination
tu effaces la ligne de ton tstringList source ...
Puis tu recommences.

Dom
Messages postés
5
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
30 avril 2008

merci a toi,

Je vais regarder ce que je peux faire. Je débute un peu avec Delphi donc j'avance tranquillement.
Je te tiens au courant
Merci encore
pyo
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
AssignFile(F1, 'c:\tmp\fich.text');         // fichier origine
AssignFile(F2, 'c:\tmp\alea.text');        // fichier aléatoire

cantador
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
cantador t'es fatigué en ce moment ...

pourquoi utiliser des TTextFile alors qu'une TStringList suffit?!

{
 melange les lignes d'un TString

 parametres :
   List [I/O] TStrings, liste a melanger
   Pass [I]   Integer, nombre de passe pour le melangeur. si -1
              le melangeur utilise le nombre de lignes contenue
              dans List.
}
procedure ListRandomizer(List: TStrings; const Pass: integer = -1);
var
 N, L, P, R1, R2 : integer;
begin
  RandSeed := GetTickCount;

  L := List.Count;

  if Pass = -1 then
    P := L-1
  else
    P := Pass;

  List.BeginUpdate;
  try
    for N := 0 to P do
    begin
      R1 := Random(L);
      R2 := Random(L);
      while R2 = R1 do
        R2 := Random(L);
      List.Exchange(R1, R2);
    end;
  finally
    List.EndUpdate;
  end;
end;

procedure FileListRandomizer(const Src, Dest : string);
var List : TStringList;
begin
  List := TStringList.Create;
  try
    List.LoadFromFile(Src);
    ListRandomizer(List);
    List.SaveToFile(Dest);
  finally
    List.Free;
  end;
end;

exemples d'utilisation :

ListRandomizer(ListBox1);
ListRandomizer(ListBox2, ListBox2.Count*2);
FileListRandomizer('fichier1.txt','fichier2.txt');

<hr size="2" width="100%" />
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
Ben oui qu'est ce que tu veux c'est comme çà, c'est l'age..

Je savais que c'était pas top et je me demandais quand est ce que tu allais intervenir pour nous donner une solution plus siouks...

cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
@foxi :

dis-donc foxi..
Petit détail, ma solution fonctionne alors que ton code plante sur
ListRandomizer(ListBox1);

car il y a incompatibilité entre TStrings et TListBox...

et autre remarque également RandSeed permet de générer d'une manière répétitive une série aléatoire alors que la question était de pouvoir faire un autre fichier mélangé de manière aléatoire ce qui n'est évidemment pas la même chose.

Comme quoi la fatigue peut gagner tout le monde même les meilleurs !

donc à ton clavier !
et ne dis plus que je suis vieux et crevé !

cantador
Messages postés
5
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
30 avril 2008

Merci à vous tous,

En fait en me levant j'ai trouvé tous vos message, mais finalement j'avais fini par trouvé avec les indications de dominique.stock.
Merci quand même

a bientot
pyo
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
@Cantador
ListRandomizer(ListBox1.Items);

on aurait corriger :)


RandSeed := GetTickCount; <=== valeur qui change tout le temps même en cas d'oublis de Randomize.



@Pyoo

aprés des tests de perf, la methode de dom, Add/Delete est plus rapide (28 secondes pour 50 000 lignes) que Exchange (122 secondes pour 50 000 lignes).
bien sur y'a l'inconvegniant de perdre la liste d'origine ...

c'est le probleme avec les strings, soit on limite l'utilisation memoire et on a un code lents, soit on blinde la memoire et on a un code rapide.
la fameuse balance de l'extreme ... :)

<hr size="2" width="100%" />
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
Merci foxi pour la précision et le test.

@+

cantador