begin process at 2013 05 25 12:31:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Système

 > 

Fichier & Disque

 > 

Extraction sur fichier csv


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Extraction sur fichier csv

mercredi 5 septembre 2012 à 19:16:53 | Extraction sur fichier csv

pat56350

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 :

Code Delphi :
[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
jeudi 6 septembre 2012 à 23:04:47 | Re : Extraction sur fichier csv

korgis

Membre Club
Salut,

Si j'ai bien compris la question, et le code en VB qui s'y rapporte, il me semble que le plus simple est d'utiliser une TStringList pour charger le fichier csv, et de l'"éclater" en strings avec sa propriété "CommaText". Puis on récupère le "Strings" correspondant au champ.

Un bout de code valant mieux qu'un long discours embrumé, voici un exemple de récupération du 4ème champ de la dernière ligne d'un fichier csv :

Code Delphi :
procedure TForm1.Button1Click(Sender: TObject);
var
  FileContents: TStringList;
  Ligne: string;
  SplittedLigne: TStringList;
  Champ: string;
begin
  { création de la StringList: }
  FileContents := TStringList.Create;
  { chargement du fichier dans la StringList: }
  FileContents.LoadFromFile('C:\RESULTAT2.csv');
  { récupération de la dernière "strings", correspondant à la dernière ligne du fichier: }
  Ligne := FileContents[FileContents.Count - 1];
  { remplacement éventuel des ";" par des "," afin d'utiliser CommaText: }
  Ligne := StringReplace(Ligne, ';', ',', [rfReplaceAll]); ShowMessage(Ligne);
  { on n'a plus besoin de "FileContents", on le libère: }
  FileContents.Free;
  { création d'une StringList qui va contenir les champs. On aurait
  pu garder la StringList qui a servi précédemment, mais c'est pour
  la clarté du code: }
  SplittedLigne := TStringList.Create;
  { éclatement de la ligne des champs délimités par des virgules: }
  SplittedLigne.CommaText := Ligne;
  { on récupère par exemple le 4ème champ, soit la String[3]: }
  Champ := SplittedLigne[3];
  { on libère "SplittedLigne": }
  SplittedLigne.Free;
  { affichage du champ dans un Edit: }
  Edit1.Text := Champ;
end;


Attention au dépassement d'index, le 4ème champ correspond à String[3], le premier indice d'une TStringList étant toujours 0.

Voici le même code plus "condensé" :

Code Delphi :
procedure TForm1.Button1Click(Sender: TObject);
var
  Champ: string;
begin
  with TStringList.Create do
  try
    LoadFromFile('C:\RESULTAT2.csv');
    CommaText := StringReplace(Strings[Count - 1], ';', ',', [rfReplaceAll]);
    Champ := Strings[3];
    Edit1.Text := Champ;
  finally
    Free;
  end;
end;


Voilà. C'est tout de même plus beau que du VB, non ?
vendredi 7 septembre 2012 à 16:13:24 | Re : Extraction sur fichier csv

pat56350

Bonjour Korgis,

Merci pour ce morceau de code qui va clairement m’être précieux

Il correspond exactement à ce que je souhaite faire.
Il me reste cependant un problÚme à régler pour faire fonctionner celui-ci avec mon Delphi 3, car je n’arrive pas à déclarer correctement la fonction « StringReplace » .
J’ai trouvé les deux lignes suivantes à insérer, mais aprÚs diverses tentatives, il est clair que je ne sais pas où les mettre.
Eh oui, c’est ça un débutant en Delphi


Code Delphi :
type TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);

function StringReplace(const S, OldStr, NewStr: string; Flags: TReplaceFlags): string;


Merci encore pour ton aide,
vendredi 7 septembre 2012 à 16:29:57 | Re : Extraction sur fichier csv

pat56350

Repost de mon dernier message sans les caractères bizarres je l'espere

Bonjour Korgis,

Merci pour ce morceau de code qui va clairement m’etre precieux…
Il correspond exactement à ce que je souhaite faire.
Il me reste cependant un probleme à regler pour faire fonctionner celui-ci avec mon Delphi 3, car je n’arrive pas à déclarer correctement la fonction StringReplace.
J’ai trouve les deux lignes suivantes à inserer, mais apres diverses tentatives, il est clair que je ne sais pas où les mettre.
Eh oui, c’est ça un debutant en Delphi…

Code Delphi :
type TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);

function StringReplace(const S, OldStr, NewStr: string; Flags: TReplaceFlags): string;


Merci encore pour ton aide,
vendredi 7 septembre 2012 à 17:14:04 | Re : Extraction sur fichier csv

korgis

Membre Club
Salut,

Peut-être avec D3 faut-il rajouter SysUtils dans les uses ? C'est l'unité où se trouve StringReplace, à partir de D4 du moins...

Code Delphi :
uses
  SysUtils;


Cette fonction permet de remplacer un caractère par un autre, voir l'aide en ligne de Delphi pour plus d'explications (mettre "StringReplace" en surbrillance dans l'éditeur, puis touche F1).

Bah, débutants, faux-débutants, experts, nous sommes tous des amateurs (*) ici

(*) amateur : qui a du goût pour, qui aime...
vendredi 7 septembre 2012 à 22:19:01 | Re : Extraction sur fichier csv

korgis

Membre Club
Holala...

Je viens de tester StringReplace sur des fichiers csv de diverses tailles.
C'est d'une lenteur catastrophique, j'avais pas idée à ce point...
Du coup j'ai fabriqué viteuf ce petit truc pour voir :

Code Delphi :
function CharReplace(const S: string; OldChar, NewChar: Char): string;
var
  i: Integer;
begin
  Result := S;
  for i := 1  to Length(Result) do
    if Result[i] = OldChar then
      Result[i] := NewChar;
end;


C'est tout con...
mais ça va tégévéesquement plus vite!

Bref, si le fichier csv dont tu veux changer les points-virgule en virgules dépasse une certaine taille, je te conseille vivement d'utiliser ma ch'tire fonction à la place de StringReplace.

Le remplacement des points-virgule par des virgules étant obligatoire si l'on veut utiliser la propriété CommaText qui va "éclater" la ligne sélectionnée en champs.
vendredi 7 septembre 2012 à 22:54:01 | Re : Extraction sur fichier csv

korgis

Membre Club
Bon... c'est vrai qu'on n'a pas besoin de convertir tout le fichier, une ligne suffit.
Donc tu peux utiliser StringReplace si tu veux, ça ne fait finalement pas une grosse différence au niveau du temps de traitement.
Je viens par contre de m'apercevoir d'une erreur dans mon second code posté, qui fait qu'il est faux et ne donne pas le résultat escompté.
Quoi qu'il en soit, voici ce que tu peux faire, en gardant toujours le même objectif qui est d'extraire le quatrième champ dans la dernière ligne du fichier :

Code Delphi :
function CharReplace(const S: string; OldChar, NewChar: Char): string;
var
  i: Integer;
begin
  Result := S;
  for i := 1  to Length(Result) do
    if Result[i] = OldChar then
      Result[i] := NewChar;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Champ: string;
begin
  with TStringList.Create do
  try
    LoadFromFile(ComboBox1.Text);
    CommaText := CharReplace(Strings[Count - 1], ';', ',');
    Champ := Strings[3];
    Edit1.Text := Champ;
  finally
    Free;
  end;
end;


Pour extraire le 1er champ de la 3ème ligne, on aurait écrit :

Code Delphi :
CommaText := CharReplace(Strings[2], ';', ','); // 3ème ligne
Champ := Strings[0];  // 1er champ


le 1er champ de la 1ère ligne :

Code Delphi :
CommaText := CharReplace(Strings[0], ';', ','); // 1ère ligne
Champ := Strings[0];  // 1er champ


Voilà, j'espère que ça n'est pas trop confus et que je ne t'ai pas trop embrouillé...
lundi 10 septembre 2012 à 01:30:37 | Re : Extraction sur fichier csv

pat56350

Bonsoir Korgis,

Merci pour ton aide, ton explication est très claire, et tout fonctionne parfaitement bien.
Je me permets de te poser une dernière question :
dans le cas ci dessus, je souhaitais récupérer les valeurs correspondant à la dernière ligne, mais comment devrais-je procéder pour récupérer les valeurs d'une ligne dont le premier champ correspondrait à une référence souhaitée par exemple ?
Est-ce possible ?

Merci encore à toi de me consacrer ce temps...

Pat.
lundi 10 septembre 2012 à 15:10:50 | Re : Extraction sur fichier csv

korgis

Membre Club
Hello Pat,

"Est-ce possible ?"
Oui. Avec Delphi, tout devient possible.
Mais je me demande si les pistes que je t'ai suggérées sont les bonnes.
Car deux choses :
1) comme tu le sais certainement, Delphi est un outil formidable de gestion des bases de données,
2) je suis désolé de te décevoir, mais je suis une quiche en matière de BDD,
3) heureusement sur ce site, certains touchent plutôt leur bille dans ce domaine...
4) oui, je sais, j'avais dit deux choses...
Or, un fichier csv, c'est quand même un fichier de données, si je ne m'abuse...
Donc, pourrais-tu nous préciser 2 ou 3 points :
- ton fichier csv, quelle taille ?
- ton projet est-il "professionnel" (nécessitant un avis d'expert),
- heu... les séparateurs sont bien des ";" ?
- si tu veux préciser autre chose, y'a pas de problème...
En effet, selon la grosseur du fichier et l'exploitation que tu veux en faire, ils se pourrait que "CommaText", "SringReplace" et compagnie soient inadaptés car trop lents et pas prévus pour un usage axé base de données. Et que mes solutions soient plutôt du "bricolage".
Voilà.

à +
lundi 10 septembre 2012 à 21:42:43 | Re : Extraction sur fichier csv

pat56350

Bonsoir Korgis,

oui, mon projet est professionnel...
l'extrait de fichier sur lequel je fais mes essais fait 2428 ko, le fichier original fait environs 7 à 8 fois cela je pense, car il y a plusieurs années d'historique supplémentaires.
La bonne nouvelle c'est que c'est vraiment un fichier csv séparé avec des "," donc pas de remplacement de caractères à effectuer.
Ton code me va très bien au niveau rapidité...

Concernant ma deuxième question, je te dois une petite explication :
j'ai un deuxième fichier qui lui est beaucoup moins gros, et dont Chacune des lignes commence par un champ "référence" sur lequel j'aimerais lancer ma recherche pour récupérer la ligne, puis les valeurs comme dans le fichier précédent.

Si c'est possible de faire ce genre de tri dans un csv, je suis bien sûr preneur pour le morceau de code...

Cordialement,

Pat

1 2

Cette discussion est classée dans : fichier, ligne, variables, champ, csv


Répondre à ce message

Sujets en rapport avec ce message

NB Ligne dans un fichier texte [ par ProGMaN007 ] salut, comment connaître le nombre de ligne dans un fichier txt ? trier un fichier texte [ par manudel ] Je dispose d'un fichier texte, composé de 2 champs séparés par un point virgule.Je charge en mémoire ce fichier dans une TStringList.Je veux faire un Recherche dans un DBgrid [ par Servalito ] Voila j'aimerais savoir comment d^placer le curseur de selection d'un DBgrid sans cliquez dessus.Plus simple passer d'une ligne a une autre simplement lire un fichier texte [ par mentral ] Bonjour,Il me faudrait un algo pour ouvrir un fichier texte, lire une ligne dont le numéro est choisi au hasard par un random, et affecter cette ligne fichier d'aide en ligne [ par bdv ] quelqu'un a t il déja réalisé une aide en lignequelque soit sa forme toutes idées, suggestions, ou sources bienvenuesthanks Effacer dans un fichier texte [ par Kundun2 ] Bonjour,Je n'arrive pas à effecer juste une ligne danbs un fichier texte.Mon fichier enumère plusieurs lignes : testligne1testligne2testligne3...je vo Suppression ligne dans un textfile [ par coframi ] Existe il une autre méthode pour supprimer une ligne dans un fichier texte que celle ci: - recopie des lignes voulues dans un fichier temporaire. Manipulation d'un fichier texte [ par koaiz ] Hug Tribue des Programmeur PalJ'utilise un fichier texte pour mon application comme log file mais j'ai un probleme car lors de la fermeture de l'appli Réécriture fichier csv [ par couf ] Bonsoir à tous,Voila ma question va vous paraitre un peu bête mais je ne sais pas comment faire.Mon problème c'et que j'ai un fichier csv (adresse.csv StringGrid et fichier texte [ par koaiz ] Salut les mecs je voudrais savoire si on peut copier le contenue d'un StringGrid dans un fichier textej'ai esssayer une methode qui consiste a copier


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,883 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales