Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.0 - Qt Creator : 4.3.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Classe de gestion des fichiers .csv

Voici une classe que j'utilise pour interroger un fichier .csv (ne gére pas les cas ou une valeur contient le caractère de séparation... jamais eu besoin)

Si ça peut servir a quelqu'un...

EDIT: mise a jour, la classe a un peu evoluée

le .h

#ifndef CSV_H
#define CSV_H

#include <QtCore>

class CSV
{
public:
CSV();

CSV(const QString &fichier, const QString &separateur = ";");//constructeur avec ouverture

CSV(const QStringList csv, const QString &separateur = ";");//constructeur a partir d'une QStringList dont chaque QString contient une ligne du fichier

bool ouvrir(const QString &fichier, const QString &separateur = ";");//ouvre un fichier .csv

bool ouvrir(const QStringList csv, const QString &separateur = ";");//ouvre a partir d'une QStringList dont chaque QString contient une ligne du fichier

const QStringList& erreur() const;//retourne liste d'erreur s'il y en a

const QStringList& listeDesChamps() const;//retourne la liste de champs

int indexDuChamp(const QString &champ) const;//retourne le numero du champ (entre 0 et nbr de champs -1)

QVector<int> indexesDeLaValeurDansLeChmap(QString valeur, QString champ) const;//retourne la liste de numero de ligne ou le champ == valeur

QString valeurDuChamp(const QString &champ, const int indexLigne) const;//retourne la valeur du champ a la ligne n° indexLigne

QString valeurDuChampSimp(const QString &champ, const int indexLigne) const;//retourne la valeur du champ simplifie a la ligne n° indexLigne

QStringList listeDesValeursDuChamp(const QString &champ) const;//retourne la liste des valeur du champ champ

int nombreDeChamps() const;//retourne le nombre de champ

int nombreDeLigne() const;//retourne le nombre de ligne

const QFileInfo nomDuFichier();//retourne un QFileInfo sur le fichier ouvert

bool estValide();

void clear();//reset la classe

//verifie si les champs a chercher sont présents dans le cvs et retourne la liste des champs manquants si une adresse est precisée
bool champsPresents(const QStringList &champsAChercher, QStringList* champsManquants = NULL);

private:
QString m_separateur;
QString m_nomFichier;
QStringList m_champs;
QVector< QStringList > m_donnees;
bool m_valid;
QStringList m_erreur;
int m_nombreDeLigne;

bool verifierIntegrite(const QStringList &csv);
bool listeVersFichier(const QStringList& lst, QString fichier);
bool fichierVersListe(QStringList& lst, QString fichier);
void reset();

};

#endif // CSV_H

et le .cpp

#include "csv.h"

CSV::CSV(): m_valid(false)
{

}

CSV::CSV(const QString &fichier, const QString &separateur): m_valid(false)
{
ouvrir(fichier, separateur);
}

CSV::CSV(const QStringList csv, const QString &separateur): m_valid(false)
{
ouvrir(csv, separateur);
}

bool CSV::ouvrir(const QString &fichier, const QString &separateur)
{
reset();
m_nomFichier = fichier;
m_separateur = separateur;

if(separateur.isEmpty())
{
m_erreur.append("le separateur est vide");
return false;
}
if(!QFileInfo(m_nomFichier).exists())
{
m_erreur.append("le fichier " + m_nomFichier + " n'existe pas");
return false;
}

QStringList csv;

if(!fichierVersListe(csv, m_nomFichier))
{
m_erreur.append("le fichier " + m_nomFichier + " n'existe pas");
return false;
}
if(!verifierIntegrite(csv))
{
m_erreur.append("echec integrite " + m_nomFichier);
return false;
}

m_champs = csv.at(0).split(m_separateur);

for(int i = 1; i < csv.size(); i++)
{
m_donnees.append(csv.at(i).split(m_separateur));
}

m_nombreDeLigne = csv.size() - 1;

m_valid = true;
return true;
}

bool CSV::ouvrir(const QStringList csv, const QString &separateur)
{
reset();
m_separateur = separateur;

if(separateur.isEmpty())
{
m_erreur.append("le separateur est vide");
return false;
}

if(!verifierIntegrite(csv))
{
m_erreur.append("echec integrite " + m_nomFichier);
return false;
}

m_champs = csv.at(0).split(m_separateur);

for(int i = 1; i < csv.size(); i++)
{
m_donnees.append(csv.at(i).split(m_separateur));
}

m_nombreDeLigne = csv.size() - 1;

m_valid = true;
return true;
}

bool CSV::estValide()
{
return m_valid;
}

const QStringList& CSV::erreur() const
{
return m_erreur;
}

const QStringList& CSV::listeDesChamps() const
{
return m_champs;
}

int CSV::indexDuChamp(const QString &champ) const
{
return m_champs.indexOf(champ);
}

QVector<int> CSV::indexesDeLaValeurDansLeChmap(QString valeur, QString champ) const
{
QVector<int> tab;
int ind = indexDuChamp(champ);
if(ind < 0)
{
return tab;
}

for(int i = 0; i < m_donnees.size(); i++)
{
if(valeur == m_donnees.at(i).at(ind))
tab.append(i);
}
return tab;

}

QString CSV::valeurDuChampSimp(const QString &champ, const int indexLigne) const
{
return valeurDuChamp(champ, indexLigne).simplified();
}

QString CSV::valeurDuChamp(const QString &champ, const int indexLigne) const
{
if(indexLigne < 0 || indexLigne > m_nombreDeLigne - 1)
{
return "";
}

int ind = indexDuChamp(champ);
if(ind < 0)
{
return "";
}

return m_donnees.at(indexLigne).at(ind);
}

QStringList CSV::listeDesValeursDuChamp(const QString &champ) const
{
int ind = indexDuChamp(champ);
if(ind < 0)
{
return QStringList();
}

QStringList retour;

for(int i = 0; i < m_donnees.size(); i++)
{
retour.append(m_donnees.at(i).at(ind));
}
return retour;
}

int CSV::nombreDeChamps() const
{
return m_champs.size();
}

int CSV::nombreDeLigne() const
{
return m_nombreDeLigne;
}

const QFileInfo CSV::nomDuFichier()
{
QFileInfo fi(m_nomFichier);
return fi;
}

bool CSV::verifierIntegrite(const QStringList &csv)
{
if(csv.size() < 2)
{
m_erreur.append("verifierInegriteCSV(): il doit y avoir au moins 2 lignes dans le csv");
return false;
}

int nbr = csv.at(0).split(m_separateur).size();

for(int i = 1; i < csv.size(); i++)
{
int nbr2 = csv.at(i).split(m_separateur).size();
if(nbr2 != nbr)
{
m_erreur.append("verifierInegriteCSV(): nombre de donnees invalide ligne "
+ QVariant(nbr2+1).toString()
+ "dans le csv");
return false;
}
}
return true;
}

void CSV::reset()
{
m_nomFichier.clear();
m_champs.clear();
m_donnees.clear();
m_valid = false;
m_erreur.clear();
m_nombreDeLigne = 0;
}

bool CSV::listeVersFichier(const QStringList& lst, QString fichier)
{
QTextStream flux;
QFile f;
f.setFileName(fichier);

if(!f.open(QIODevice::WriteOnly | QIODevice::Text))
{
m_erreur.append("Impossible d'ouvrir le fichier " + fichier);
return false;
}
flux.setDevice(&f);

for(int i=0; i<lst.length(); i++)
{
flux<<lst.at(i)<<"\n";
}

f.close();
return true;
}

bool CSV::champsPresents(const QStringList &champsAChercher, QStringList *champsManquants)
{
if(champsManquants)
champsManquants->clear();

bool test = true;
for(int i = 0; i < champsAChercher.size(); i++)
{
if(indexDuChamp(champsAChercher.at(i)) < 0)
{
test = false;
if(champsManquants)
champsManquants->append(champsAChercher.at(i));
}
}
return test;
}

bool CSV::fichierVersListe(QStringList &lst, QString fichier)
{
lst.clear();
QTextStream flux;
QFile f;

f.setFileName(fichier);
if(! f.open(QIODevice::ReadOnly | QIODevice::Text))
{
m_erreur.append("Impossible d'ouvrir le fichier " + fichier);
return false;
}

flux.setDevice(&f);

while(!flux.atEnd())
{
lst.append(flux.readLine());
}
f.close();
return true;
}

void CSV::clear()
{
reset();
}


Réponses

Connectez-vous ou Inscrivez-vous pour répondre.