Lecture d'un fichier text

Dangona Messages postés 4 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 31 mars 2008 - 21 juin 2007 à 18:31
Dangona Messages postés 4 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 31 mars 2008 - 25 juin 2007 à 21:35
Bonjour,

S V P quelqu'un pourra m'aider à lire un fichier text  et le stocker dans un tableau de réels.
la structure defichier est la suivante 12.2 ,12 ,15.3
                                                              14.5 , 45.3 ,47
                                                              42, 63.2 , 17
C'est la vigule qui gène.(delphi)

La deuxième question est sur l'utilisation d'une fonction pour un temps d'attente sans rien faire à l'opposé du timer qui exécute un code.

Merci d'avance. 

10 réponses

sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 5
21 juin 2007 à 21:29
Après avoir déclaré :

type
matrice= array[0..2,0..2]of double;

écris cette procédure :

procedure arrayFromFile (fichier:tfilename;tableau:matrice);
var l:tstringlist;
s,ss:string;
i,k:integer;


function pointToVirgule (s:string):string;
var i:integer;
begin
for i:=1 to length(s) do
if s[i]='.' then s[i]:=',';
result:=s;
end;


begin
try
try
l:=tstringlist.create;
l.LoadFromFile(fichier);
for i:=0 to 2 do
begin
s:=l[i];
k:=pos(',',s);
ss:=trim(copy(s,1,k-1));
tableau[i,0]:=strtofloat(pointToVirgule(ss));
s:=copy(l[i],k+1,length(l[i])-k);
k:=pos(',',s);
ss:=trim(copy(s,1,k-1));
tableau[i,1]:=strtofloat(pointToVirgule(ss));
tableau[i,2]:=strtofloat(pointToVirgule(copy(s,k+1,length(l[i])-k)));
end;
except
showmessage('Echec !');
end;
finally
l.Free;
end;
end;

et appelles là par exemple avec :

procedure TForm1.Button1Click(Sender: TObject);
begin
if opendialog1.execute then
arrayfromfile(opendialog1.filename,tableau);
end;

si tu as ajouté auparavant un TOpenDialog sur ta fiche

Pour ta deuxième question essaye une procedure du genre :
debut:=now;
repeat
application.processmessages;
until now-debut>temps_dattente

SISI231
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 juin 2007 à 21:31
Sisi231, arrête de flooder, lol
0
sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 5
21 juin 2007 à 21:34
excuse moi mais mon ordi était presque planté alors je cliquais comme un dingue croyant que ça ne marchais pas pour finir la page d'ie a fini par devenir blanche et plus rien !

SISI231
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 juin 2007 à 21:38
C'est sûr qu'avec Firefox, j'ai moins de problèmes... (troll)
0

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

Posez votre question
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 juin 2007 à 21:45
Une autre approche (pour le fun), en utilisant les méthodes que j'évoquais plus haut :

var

  TabXtended: array of Extended; // tableau dynamique

  NomDuFichier: string;


procedure TextToArrayOfXtnd(const FileName: string);

var

  i: Integer;

begin

  with TStringList.Create do

  try

    LoadFromFile(FileName);

    CommaText := Text;

    SetLength(TabXtended, Count);

    for i := 0 to Count - 1 do

    begin

      Strings[i] := StringReplace(Strings[i], '.', DecimalSeparator, []);

      //Trim(Strings[i]);  // <- en principe inutile

      TabXtended[i] := StrToFloat(Strings[i]);

    end;

  finally

    Free;

  end;

end;


procedure TForm1.Button1Click(Sender: TObject);

var i: Integer;

begin

  TextToArrayOfXtnd(NomDuFichier);

  // Vérification avec un Memo :

  Memo1.Clear;

  for i := 0 to Length(TabXtended) - 1 do

    Memo1.Lines.Add(FloatToStr(TabXtended[i]));

end;


Ça va pas mal aussi...


Bonne prog'
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
22 juin 2007 à 01:57
LOL!

type
  TDoubleArray = array of double;

function DoubleArrayFromFile(const FileName : string; var DA : TDoubleArray;                             const DecSep : char '.'; const ValSep : char ',') : integer;
var ODS : char;
    N   : integer;
begin
  // sauvegarde du separateur de decimale
  ODS := DecimalSeparator;
  // modification du separateur de decimale
  DecimalSeparator := DecSep;
  try
    // creation d'une liste
    with TStringList.Create do
    try
      // definition du separateur de chaines
      Delimiter := ValSep;

      // chargement du fichier
      LoadFromFile(FileName);
     
      // abracadabra ...
      DelimitedText := Text;

      // si on a bien une ou plusieurs lignes
      if Count > 0 then
      begin
        // on definit la taille de DA
        SetLength(DA, Count);
     
        // on initialise Result a 0 (compteur d'erreur)
        Result := 0;

        // on tente de placer les valeurs dans le tableau   
        for N := 0 to Count-1 do
          try
            // L'indice de la valeur dans le tableau se fait en fonction
            // du nombre d'erreurs rencontrées.
            DA[N-Result] := StrToFloat(Strings[N]);
          except
            // try ... except obligatoire pour detecter les erreurs de convertions
            // l'erreur s'affiche sous delphi mais pas dans le programme!
            on EConvertError do Result := Result + 1;
          end;
        // on redefinie la taille du talbeau pour supprimer tout l'espace qui n'a pas
        // été utilisé.
        SetLength(DA, Count-Result);
      end;

    finally
      // try ... finally obligatoire pour liberer la liste
      Free;
    end;

  finally
    // try ... finally obligatoire pour restaurer le separateur de decimale
    DecimalSeparator := ODS;
  end;
end;
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
22 juin 2007 à 09:08
salut tout le monde,

encore un de ces sujets ou tout le monde vient mettre son grain de sel... :-D

@F0xi:

"
DA[N-Result] := StrToFloat(Strings[N]);
          except
            // try ... except obligatoire pour detecter les erreurs de convertions
"
et Try StrToFloat alors !?!

<hr size ="2" width="100%" />
Pour l'attente, je te déconseille les attente active genre boucle . Un sleep c'est bien mieux.

bon code,

Loda
<hr size ="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
Dangona Messages postés 4 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 31 mars 2008
22 juin 2007 à 20:52
Bonjour,

Merci pour toutes ces réponses.
Si je peux avoir une méthode pour remplacer dans le fichier  les virgules par des espaces(une vigule par un blanc) c'est l'idéal je pense.Et après je peux directement lire mes valeurs en réel.
En fait ce n'est pas tout le fichier que je veux manipuler,j'ai besoin juste de quelques colonnes siblées.
  
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
24 juin 2007 à 18:58
sinon une question, est-ce que c'est toi qui crée le fichier de base ?

si oui tu as plus simple, il te suffit de stocker dans le fichier les valeurs flottante et c'est tout, ce serat plus leger et plus pratique.
0
Dangona Messages postés 4 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 31 mars 2008
25 juin 2007 à 21:35
Bonjour,

Non, je ne suis qu'un utilisateur du ficheir en question qui n'a pas été écri en bon format. Des caractère ', ' (virgule) ont été insérés  pour séparer les différentes lignes; pour une question de lisibilité.
Moi, je n'ai besoin que des quelques lignes bien ciblées.

cordialement,
0