Bonjour,
Je voudrais lire des fichiers CSV mais je n'ai pas l'algo, et n'y a t'il pas un driver qui lit cela directement comme odbc ?
Merci d'avance.
Version imprimable
Bonjour,
Je voudrais lire des fichiers CSV mais je n'ai pas l'algo, et n'y a t'il pas un driver qui lit cela directement comme odbc ?
Merci d'avance.
sony351 a ecrit:
Tu peu utiliser un StringGrid pour y deposer tes donnees et les travailler.Citation:
Bonjour,
Je voudrais lire des fichiers CSV mais je n'ai pas l'algo, et n'y a t'il pas un driver qui lit cela directement comme odbc ?
Merci d'avance.
Entre autres solutions, il est possible avec le composant TAdvListView de www.tmssoftware.com d'utiliser une fonction comme ListView1->LoadFromCSV("Fichier.csv"). Dans ce cas, le fichier remplit une boîte de liste (à configurer en vsreport pour visualiser tous les champs).
Tout dépend de ce que tu veux faire de tes données.
Sais tu au moins comment est organisé un fichier CSV ?
Une ligne dans le "tableau" = une ligne dans le fichier.
Chaque colonne dans une ligne est séparée par un ;
A partir de là tu devrais sans problème arriver à écrire toi même le petit bout de code qui permet de "parser" un fichier CSV....bien entendu si tu veux afficher le fichier dans l'équivalent d'un TStringGrid, les solutions qui t'ont été proposée juste au dessus sont bien mieux !
Oui mais cet algo est complexe car il peut y avoir des doubles quote ou pas pour la data, ensuite si il y a des ; ou double quote dans la data, puis enfin il y a la gestion des erreurs.
Est ce que quelque chose comme ceci te depannerai.
L'ouverture du fichier se fait par une boite de dialogue, il y a un teste qui cherche le type de separateur et de fin de ligne, chaque champ est ecrit dans une cellule d'un StringGrid.Citation:
{
///////////////////////////////////
// on redefini le separateur decimal
////
DecimalSeparator = '.';
///////////////////////////////////
// ici on appelle la boite de dialogue ouvrir un fichier
// avec les options et le filtre
OpenDialog1->Options.Clear();
OpenDialog1->Options << ofAllowMultiSelect << ofFileMustExist;
OpenDialog1->Filter = "Fichiers TXT (*.TXT) (*.txt)|*.txt|Fichiers DOC (*.DOC) (*.doc)|*.doc|Fichiers CSV (*.CSV) (*.csv)|*.csv";
OpenDialog1->FilterIndex = 3; // demarre le dialogue d'affichage des fichiers
///////////////////////////////////
if(OpenDialog1->Execute() == NULL)
{
// si aucune selection on quitte
ShowMessage("aucun fichier selectionné arret du programme");
Application->Terminate();
}
else
{
String FilePath = OpenDialog1->FileName;
///////////////////////////////////
// ici on va charger la StringGrid avec le fichier
int i;
int j;
int k;
char b;
AnsiString convertisseur;
TStringList *MyStringList = new TStringList();
MyStringList->LoadFromFile(FilePath); //Si tu as créer ton extension lors de la sauvegarde, penses à réutiliser la même ici.
StringGrid1->ColCount=1;//cela met la grille à une seule colonne de base
StringGrid1->RowCount=1;//cela met la grille à une seule ligne de base
for(i=0;i<MyStringList->Count;i++)
{
convertisseur=MyStringList->Strings[i];
// teste pour trouver les separateurs en fonction on modifie
// (convertisseur.Pos("\t"));
if (convertisseur.Pos("\t") > 0)
b = '\t';
else
if (convertisseur.Pos("\;") > 0)
b = '\;';
else
if (convertisseur.Pos("\,") > 0)
b = '\,';
// on va chercher le separateur soit ( "\t" ) soit ( "\;" ) soit ( "\," )
for(j=0;(convertisseur.Pos(b)>=1);j++)
{
// on va chercher le separateur soit ( "\t" ) soit ( "\;" ) soit ( "\," )
convertisseur[convertisseur.Pos(b)]='\n';
//voir s'il faut ajouter un test sur le cas où j=0
if(j>StringGrid1->ColCount)
StringGrid1->ColCount = j; //Il est possible que cela soit un j-1 ou un j+1...
if(i>(StringGrid1->RowCount-1))
StringGrid1->RowCount = i+1;
StringGrid1->Rows[i]->Text = convertisseur; // x correspond à la ligne, 0 pour la première, souvent grisée
}//fin du for
}
delete MyStringList; //si cette ligne te poses un soucis essayes de la supprimer: en théorie elle est nécessaire.