Extraction sur fichier csv

Résolu
pat56350 - 5 sept. 2012 à 19:16
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 - 12 sept. 2012 à 11:46
Bonjour à tous,

J'aurais besoin de récupérer cycliquement la dernière ligne d'un fichier csv, puis de ranger ses différents champs dans des variables ou tableau de variables.
Nota : je n'ai à ma disposition qu'une version PRO de Delphi 3 (oui, je sais ça commence à dater)
En ce qui concerne la partie décomposition du csv pour rangement dans des variables, j'ai trouvé comment le faire simplement en VB, mais impossible de trouver une fonction équivalente en Delphi.

Merci d'avance pour votre aide,

Ex pour récupération d'un champ en VB :

[Dim fileContents As String
        fileContents = My.Computer.FileSystem.ReadAllText("C:\RESULTAT2.csv")
        Dim ligne As String = fileContents.Split(vbLf)(4)
        Dim champ As String = ligne.Split(",")(2)
        TextBox1.Text = champ
        Return

15 réponses

korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
10 sept. 2012 à 23:33
Bonsoir,

Voici voilà :

type
  TArrayOfFields = array of string;

procedure GetFields(FileName: string; Index: Integer; FindText: string; out arrFields: TArrayOfFields);
var
  i, j: Integer;
  Fields: TStringList;
begin
  with TStringList.Create do
  try
    LoadFromFile(FileName);
    Fields := TStringList.Create;
    try
      for i := 0 to Count - 1 do
      begin
        //Fields.CommaText := CharReplace(Strings[i], ';', ',');
        // si les champs sont séparés par des virgules, CharReplace devient superflu
        Fields.CommaText := Strings[i];
        if Fields[Index] = FindText then
        begin
          SetLength(arrFields, Fields.Count);
          for j := 0 to Fields.Count - 1 do
            arrFields[j] := Fields[j];
          Break;
        end;
      end;
    finally
      Fields.Free;
    end;
  finally
    Free;
  end;
end;


J'ai testé ce code sur un fichier csv de 3,40 Mo, comprenant 36569 lignes de 19 champs chacune.
Le temps d'exécution paraît tout à fait acceptable dans ces conditions.
Evidemment, si l'index se trouve dans les premières lignes, c'est plus rapide que s'il se trouve à la fin.
On doit donc pouvoir améliorer avec une recherche dichotomique...
Les champs sont retournés sour forme d'un tableau dynamique de strings (array of strings) dont l'indice commence à zéro et dont la longueur et réglée automatiquement à l'intérieur de la procedure.
Si le champ "référence" est le premier, on passera en paramètre "index" la valeur "0".
Une TStringList commence toujours à l'index 0, et un tableau dynamique aussi.

On peut utiliser ce code ainsi, le Memo servant à afficher les champs récupérés :

procedure TForm1.btnSearchClick(Sender: TObject);
var
  ArrayOfFields: TArrayOfFields;
  Reference: string;
  i: Integer;
begin
  Reference := 'GT01258';
  GetFields('TonFichier.csv', 0, Reference, ArrayOfFields);
  Memo1.Clear;
  for i := 0 to High(ArrayOfFields) do
    Memo1.Lines.Add(ArrayOfFields[i]);
end;


Je ne rentre pas plus dans les détails, mais si quelque chose t'échappe, n'hésite pas à demander.

Bon coding.
3
Rejoignez-nous