Creation + trie d'un TFileStream

[Résolu]
Signaler
Messages postés
75
Date d'inscription
mardi 28 juin 2005
Statut
Membre
Dernière intervention
21 avril 2010
-
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
-
Bonjour,
Je voudrais creer un TFileStream pour y inséré des numero extrait d'un fichier txt.

Ex d'une ligne du fichier txt:
Bon de livraison 00069036 du 30/07/2005 Client XXX.....

Je voudrais extraire le numero 00069036. J'ai beaucoup de ligne a extraire et a inserer dans le TFileStream.
Une fois ceci fait, je voudrais trier mon TFileStream dans l'ordre croissant.

Je ne sais pas trop comment faire, merci de votre aide.

12 réponses

Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
TStringList vaut plus qu'un tableau étant donné toutes les fonctionnalités mise à ta disposition : nombre d'item, recherche de position, rapidité de manipulation... Y'a plein d'ASM et de pointeurs.

Pour un tableau dynamique :
var Tableau : array of quelquechose;
begin
SetLength(Tableau,Taille);
//Prêt
end;

Fonctionne D5+...

===========
Validez les réponses si ok...

ViewVite XP : HTML
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Utilise plutôt un TStringList pour dresser des listes de numéros, quitte après à l'enregistrer dans un fichier texte.

Après, tu fais :
MonStringList.Sort;

Utilise la fonction Copy(...) pour extraire des sous-chaînes.

===========
Validez les réponses si ok...

ViewVite XP : HTML
Messages postés
75
Date d'inscription
mardi 28 juin 2005
Statut
Membre
Dernière intervention
21 avril 2010

Sinon je pense avoir une petite idée sur la façon de faire. En faite j'ai pensée apres reflection, d'oublier le TFileStream, et de créer un tableau dinamique, et ensuite de faire un tri a bulle. Mais comment créer mon tableau dinamique?
Messages postés
75
Date d'inscription
mardi 28 juin 2005
Statut
Membre
Dernière intervention
21 avril 2010

Ouais, je vais faire un copy pour extraire les num. J'ai vu sa dans l'aide delphi (j'aurais du regarder avant). Mais pour le tableau dynamique, comment je peux faire d'apres toi?
Messages postés
75
Date d'inscription
mardi 28 juin 2005
Statut
Membre
Dernière intervention
21 avril 2010

Merci.
Dans:
var Tableau : array of quelquechose;
Le quelquechose correspond a quoi?

Et fonctionne D5+... ça veut dire quoi?
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
array of integer
array of string
array of TStringList
Bref... un tableau de types (structures ou objets)

Les array de taille indéfinie ne sont pas supportés par tous les linkers Delphi, notamment Delphi (D3) pour le 32 bits. Quand je met D5+, cela veut dire compatible pour Delphi version 5 et versions plus récentes. Mais il me semble même que D4 supporte ce genre de tableaux.

===========
ViewVite XP : HTML
Messages postés
75
Date d'inscription
mardi 28 juin 2005
Statut
Membre
Dernière intervention
21 avril 2010

Ah d'accord, c'est bon pour moi alors je bosse sous Delphi 7.
Merci pour ces renseignement
Messages postés
75
Date d'inscription
mardi 28 juin 2005
Statut
Membre
Dernière intervention
21 avril 2010

Pour inserer dans mon tableau ce que j'ai extrait avec la fonction copy(...)? quelle est la synthaxe?
Messages postés
75
Date d'inscription
mardi 28 juin 2005
Statut
Membre
Dernière intervention
21 avril 2010

Encore une question:
Je voudrais lui dire:
Si Debut_de_la_ligne commence par 'Bon' alors...
Comment lui demander si la ligne du fichier txt commence par 'Bon'?
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Pour inserer dans mon tableau ce que j'ai extrait avec la fonction copy(...)? quelle est la synthaxe?

Si tu as un array of string et que l'index numéro N est disponible, tu fais :
MonTableau[N]:= 'Ma chaine de caractères';
...sachant que string est illimité dans la longueur (l'allocation de mémoire automatique et dynamique).

Sache que quand tu fais SetLength(Tableau,N), le tableau va de la case 0 à N-1. C'est pas sûr, mais en tout cas, ne te fais pas avoir avec les index qui ne commencent jamais à 1 (c'est d'ailleurs très rare les tableaux & listes qui commencent à 1).

De même pour les listes, la dernière valeur est donnée par :
MaListe[MaListe.Count-1]; //si et seulement si MaListe.Count>0


<HR>

Comment lui demander si la ligne du fichier txt commence par 'Bon'?

const Marque = 'Bon';
begin
if LowerCase(Copy(MaChaine,1,Length(Marque)))= LowerCase(Marque) then
ShowMessage('MaChaine commence par "'+Marque+'", sans gérer la casse des caractères.');
end;

Si tu charges ton fichier texte à ligne dans un TStringList, alors le début du fichier sera donné par :
MaListe[0];

La longueur de cette chaîne dépend uniquement du fichier considéré.

Cependant, il ne faut pas charger des fichiers énormes dans les listes. Faut alors simuler les TStringList par des lectures linéaires des fichiers à l'aide des fonctions de base : AssignFile, Reset, ReadLn, Eof et CloseFile;

=============
ViewVite XP : HTML
Messages postés
75
Date d'inscription
mardi 28 juin 2005
Statut
Membre
Dernière intervention
21 avril 2010

Pour insérer dans mon tableau, je ne peux pas faire directement?

MonTableau[N]:=copy(...);
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Ben non, car la case n'est pas allouée => exception EAccessViolation.

Tu dois d'abord redéfinir la nouvelle longueur (de taille N+1), et après tu peux faire ce que tu veux sur la case N.

Tu utiliserais les listes, qu'il suffirait juste de faire :
MaListe.Add(Copy(...));

===========
ViewVite XP : HTML