Accueil > Forum > > > > Extraction sur fichier csv
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
|
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
|
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 :
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
|
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
|
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
|
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
|
|
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
Livres en rapport
|
Derniers Blogs
ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0 par Philess
L'extensibilité du Team Web Access
Le Web Access (site d'équipe) de Team Foundation Server a été complètement réécrit dans la version 2012 avec pas moins de 400.000 lignes de JavaScript. Ce nouveau modèle a été pensé pour offrir de grandes...
Cliquez pour lire la suite de l'article par Philess SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|