IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

gérer automatiquement l'entete d'un fichier CSV


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 039
    Par défaut gérer automatiquement l'entete d'un fichier CSV
    Bonjour

    Je fais une application qui lit des fichiers CSV provenant de différentes sources.
    Tous les CSV ont une ligne avec le nom des champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Date; valeur1;valeur2;....
    et les données qui suivent dès la ligne suivante.

    MAIS avant la ligne des noms des champs, il peut y avoir X lignes de baratin

    Aujourd'hui je lis mes CSV avec un streamreader et un amis je dois ruser et préciser manuellement la position de la ligne des noms de champs, pour chaque fichier CSV.

    Par quel outil ou stratagème peut on détecter automatiquement la première ligne utile d'un fichier CSV ?

    Merci par avance pour vos idées.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par petitours Voir le message
    MAIS avant la ligne des noms des champs, il peut y avoir X lignes de baratin
    Il ressemble à quoi ce baratin ? C'est des commentaires ? Il n'y a pas un préfixe spécifique genre "#" ou "//" qui indique que ce n'est pas des données ?

  3. #3
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 039
    Par défaut
    Bonjour

    Ce baratin ressemble a tout et n'importe quoi, du fait de l’origine très variée des fichiers. Il n'y a aucun formalisme particulier.

    Sur certains fichiers (de test par exemple) il peut ne pas y avoir d’entête du tout
    Sur certains un peu compliqués, il y a jusqu’à une 40n de ligne, avec beaucoup de texte explicatif, des descriptions de variables, d'unités et j'en passe

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Dans ce cas, la seule solution que je vois est de tester chaque ligne pour voir s'il y a bien le nombre de champs attendu (en faisant un split).

  5. #5
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 039
    Par défaut
    j'aurais peut être du préciser que...je ne connais pas le nombre de champ !
    il y en a 2 minimum (une date + au moins une donnée) mais potentiellement bien plus.

    Dans mon appli j'ouvre un CSV, ça me liste tous les champs du fichiers et je sélectionne ceux que je veux traiter.

    La solution que j'ai imaginé est de faire des split, de compter le nombre de champ et de considérer le début des données quand le nombre de split devient maximum et constant (et avec des valeurs numériques)

    mais ça fait super lourd à traiter, je n'ai pas réussi à mettre un chronogramme sur le papier encore.

    Merci

  6. #6
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par petitours Voir le message
    La solution que j'ai imaginé est de faire des split
    Ça ne fonctionnera pas avec les chaînes de caractères contenant des séparateurs ou des sauts de ligne. Pour en avoir déjà fait un, quelques leçons retenues :

    * Il faut créer un petit parser pour gérer les échappements de chaînes de caractères (au moins \"). Donc parcourir tous les caractères un à un à la main en faisant évoluer les états.

    * Il faut supporter différents formats :
    ** Différents délimiteurs de chaînes de caractères (" ou ')
    ** Différents séparateurs (, ; \t \n)
    ** Avec ou sans en-têtes
    ** Avec ou sans échappement de \n et \t. Penser aux sauts de lignes dans les chaînes de caractères.

    * Puis tester chaque format possible et déterminer à chaque fois si les résultats sont cohérents ou non (Les lignes retournées ont-elles des colonnes homogènes ? Y a t-il plus d'une ligne et plus d'une colonne ?)

  7. #7
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 039
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Il n'y a pas un préfixe spécifique genre "#" ou "//" qui indique que ce n'est pas des données ?
    Ça me travaille depuis ce message... je n'y avais pas pensé mais, à voir la difficulté de retrouver ce baratin automatiquement, il ne serait pas déconnant que je m'impose l'ajout d'un /* et d'un */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* baratin
    encore du baratin */
    Ça va surement être ça la solution au final. Cela lèvera juste le soucis de devoir éditer le fichier pour ajouter le /* et */... Avec un très gros fichier wordpad ou Notepad++ tirent la langue des fois.

    Ceci étant dit,
    Citation Envoyé par tomlev Voir le message
    apparement il y a une exception spécifique (MalformedLineException) quand une ligne est mal formée ; tu peux toujours intercepter cette erreur et ignorer la ligne...
    est intéressant.
    A quelle moment interviendrait elle cette exception ? La notion de "mal formée" n'implique pas que je traite une ligne en connaissant le nombre de colonnes et/ou le format ?

    Merci

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par petitours Voir le message
    Ça me travaille depuis ce message... je n'y avais pas pensé mais, à voir la difficulté de retrouver ce baratin automatiquement, il ne serait pas déconnant que je m'impose l'ajout d'un /* et d'un */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* baratin
    encore du baratin */
    Pourquoi pas plutôt un préfixe qui met toute la ligne en commentaire ? c'est nettement plus facile à parser...

    Citation Envoyé par petitours Voir le message
    Ça va surement être ça la solution au final. Cela lèvera juste le soucis de devoir éditer le fichier pour ajouter le /* et */... Avec un très gros fichier wordpad ou Notepad++ tirent la langue des fois.
    Avec notepad2 ça marche bien, même pour des gros fichiers. Mais de toutes façons, si tu dois éditer le fichier pour ajouter ça, autant supprimer carrément le baratin...

    A quelle moment interviendrait elle cette exception ? La notion de "mal formée" n'implique pas que je traite une ligne en connaissant le nombre de colonnes et/ou le format ?
    Elle est levée lors de l'appel à la méthode ReadFields(), si le parser n'arrive pas à lire les champs. A priori pas de problème de nombre de colonnes

  9. #9
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 039
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pourquoi pas plutôt un préfixe qui met toute la ligne en commentaire ? c'est nettement plus facile à parser...
    Mais pas à ajouter dans le fichier !
    Il doit bien y avoir moyen de détecter facilement ce qui est en fin de ligne (détecter le */)
    Elle me plait de plus en plus cette technique ; au prix d'une mini intervention sur le fichier je peux non seulement identifier le baratin mais aussi identifier pareil la ligne des noms de colonne, une ligne avec les unités ....

    Au final c'est surement bien plus sain de formater tous mes fichiers de données pareil que de faire une usine à gaz qui s'adapte à "tout".

    Citation Envoyé par tomlev Voir le message
    Avec notepad2 ça marche bien, même pour des gros fichiers. Mais de toutes façons, si tu dois éditer le fichier pour ajouter ça, autant supprimer carrément le baratin...
    Ce baratin donne l'origine , le cadre et les commentaires sur le fichier, j'ai plus tendance à vouloir augmenter le baratin qu'à le retirer.
    Citation Envoyé par tomlev Voir le message
    Elle est levée lors de l'appel à la méthode ReadFields(), si le parser n'arrive pas à lire les champs. A priori pas de problème de nombre de colonnes
    CF ma très grosse bête noire du moment
    http://www.developpez.net/forums/d13...ntite-donnees/

    ReadFields() peut il être plus rapide qu'un split ?

  10. #10
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par petitours Voir le message
    ReadFields() peut il être plus rapide qu'un split ?
    Le problème est que comme expliqué plus haut un split ne fonctionnera pas avec les chaînes de caractères contenant des séparateurs de champs. Et il ne résoudra pas non plus les échappements de chaînes de caractères ou les sauts de lignes dans celle-ci. Les chaînes de caractères imposent une alternative plus sophistiquée comme celle proposée par Tomlev.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par petitours Voir le message
    Mais pas à ajouter dans le fichier !
    Bof, n'importe quel éditeur digne de ce nom a une fonctionnalité "comment line" avec un raccourci clavier... tu as juste à sélectionner les lignes et à faire ça.

Discussions similaires

  1. [AC-2003] Creation automatique de table depuis des fichiers CSV
    Par basto dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/09/2011, 16h29
  2. Réponses: 1
    Dernier message: 21/04/2011, 11h30
  3. Réponses: 3
    Dernier message: 23/02/2009, 13h32
  4. Réponses: 4
    Dernier message: 13/02/2008, 08h34
  5. Import de fichier CSV automatique dans Access
    Par Jmar dans le forum Access
    Réponses: 4
    Dernier message: 20/01/2006, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo