Changer l'ordre des lignes dans un fichier texte

Résolu
pyoo Messages postés 5 Date d'inscription mardi 29 avril 2008 Statut Membre Dernière intervention 30 avril 2008 - 29 avril 2008 à 14:03
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 30 avril 2008 à 21:28
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

dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
29 avril 2008 à 14:14
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
3
pyoo Messages postés 5 Date d'inscription mardi 29 avril 2008 Statut Membre Dernière intervention 30 avril 2008
29 avril 2008 à 14:24
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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
29 avril 2008 à 19:58
AssignFile(F1, 'c:\tmp\fich.text');         // fichier origine
AssignFile(F2, 'c:\tmp\alea.text');        // fichier aléatoire

cantador
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
29 avril 2008 à 22:27
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%" />
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
29 avril 2008 à 22:43
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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
30 avril 2008 à 09:19
@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
0
pyoo Messages postés 5 Date d'inscription mardi 29 avril 2008 Statut Membre Dernière intervention 30 avril 2008
30 avril 2008 à 09:52
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
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
30 avril 2008 à 19:26
@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%" />
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
30 avril 2008 à 21:28
Merci foxi pour la précision et le test.

@+

cantador
0