Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LIRE UNE COLONNE DANS UN CSV (FUNCTION)


Information sur la source

Catégorie :Texte Source .NET ( DotNet ) Classé sous : excel, lire csv, colonne Niveau : Débutant Date de création : 28/09/2007 Date de mise à jour : 02/10/2007 08:39:20 Vu : 5 834

Note :
Aucune note

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

Pouvoir lire une colonne en particulier dans un CSV.
J'utilise beaucoup d'export CSV et rare sont les fois ou je réutilise la totalité du CSV, je lis par exemple un index produit, puis le resultat du test (ok/nok) je n'utilise pas les x autres colonnes (date, opérateur,...).
Donc j'ai eu l'idée de faire une petite fonction "bricolée" pour faire cela.
Cette fonction averti l'utilisateur si le fichier CSV n'existe pas ou si la colonne demandé n'existe pas. Possibilité aussi de ne pas traiter la premiére ligne si elle contient les titres des colonnes.
Merci de donner vos avis sur les optimisations possible du code. salut
 

Source

  • Public Function lire_colonne_CSV(ByVal fichier As String, ByVal séparateur As String, ByVal ligne_de_titre As Boolean, ByVal num_col As Integer) As String()
  • Dim colonnes_de_la_ligne As String() ' tableau de champs à lire pour une ligne
  • Dim index_ligne As Integer = 0 ' index de ligne en cours
  • Dim monfichier_existe As Boolean = My.Computer.FileSystem.FileExists(fichier) ' variable binaire qui test la présence du fichier
  • Dim valeurs_lus(0) As String 'status du traitement de la fonction
  • 'defaut = 0 => OK, defaut =1 => fichier pas trouvé, defaut =2 => colonne pas trouvé
  • If monfichier_existe Then
  • ' obligé pour l'instant de faire un tour à vide du fichier pour dimensionner le tableau en fonction du nb de ligne
  • Using lirecsv As New Microsoft.VisualBasic.FileIO.TextFieldParser(fichier)
  • lirecsv.SetDelimiters(séparateur)
  • While Not lirecsv.EndOfData 'tant que pas fin de fichier
  • colonnes_de_la_ligne = lirecsv.ReadFields()
  • index_ligne += 1 ' on compte le nombre de ligne
  • 'vérification de la demande de lecture
  • If num_col > colonnes_de_la_ligne.Length - 1 Then
  • valeurs_lus(0) = "impossible de trouver la colonne"
  • GoTo fin
  • End If
  • End While
  • End Using
  • 'nombre de lignes luent moins la derniére et la premiére si ligne de titre
  • Dim a As Integer
  • If ligne_de_titre Then a = 1 Else a = 0 ' suppression de la ligne de titre ou pas
  • ReDim valeurs_lus(index_ligne - a) 'redimensionnement du tableau
  • valeurs_lus(0) = "ok" 'status fonction OK
  • 'raz de l'index ligne pour remplissage des valeurs
  • index_ligne = 1
  • Using lirecsv As New Microsoft.VisualBasic.FileIO.TextFieldParser(fichier)
  • lirecsv.SetDelimiters(séparateur)
  • While Not lirecsv.EndOfData 'tant que pas fin de fichier
  • colonnes_de_la_ligne = lirecsv.ReadFields() ' on lit tous les champs de la ligne en cours
  • 'élimine la premiére ligne si c'est la ligne des titres
  • If Not ligne_de_titre Then ' au premier cycle on ne fait rien
  • valeurs_lus(index_ligne) = (colonnes_de_la_ligne(num_col))
  • index_ligne += 1
  • End If
  • ' mise à vrai lorsque la premiére ligne est passé
  • ligne_de_titre = False
  • End While
  • ' transfert de la lecture
  • Return valeurs_lus
  • End Using
  • Else
  • valeurs_lus(0) = "impossible de trouver le fichier"
  • End If
  • fin:
  • Return valeurs_lus
  • End Function
           Public Function lire_colonne_CSV(ByVal fichier As String, ByVal séparateur As String, ByVal ligne_de_titre As Boolean, ByVal num_col As Integer) As String()
        Dim colonnes_de_la_ligne As String() ' tableau de champs à lire pour une ligne
        Dim index_ligne As Integer = 0 ' index de ligne en cours
        Dim monfichier_existe As Boolean = My.Computer.FileSystem.FileExists(fichier) ' variable binaire qui test la présence du fichier
        Dim valeurs_lus(0) As String  'status du traitement de la fonction
        'defaut = 0 => OK, defaut =1 => fichier pas trouvé, defaut =2 => colonne pas trouvé

        If monfichier_existe Then
            ' obligé pour l'instant de faire un tour à vide du fichier pour dimensionner le tableau en fonction du nb de ligne
            Using lirecsv As New Microsoft.VisualBasic.FileIO.TextFieldParser(fichier)
                lirecsv.SetDelimiters(séparateur)
                While Not lirecsv.EndOfData 'tant que pas fin de fichier
                    colonnes_de_la_ligne = lirecsv.ReadFields()
                    index_ligne += 1 ' on compte le nombre de ligne
                    'vérification de la demande de lecture
                    If num_col > colonnes_de_la_ligne.Length - 1 Then
                        valeurs_lus(0) = "impossible de trouver la colonne"
                        GoTo fin
                    End If
                End While
            End Using

            'nombre de lignes luent moins la derniére et la premiére si ligne de titre
            Dim a As Integer
            If ligne_de_titre Then a = 1 Else a = 0 ' suppression de la ligne de titre ou pas
            ReDim valeurs_lus(index_ligne - a) 'redimensionnement du tableau
            valeurs_lus(0) = "ok" 'status fonction OK
            'raz de l'index ligne pour remplissage des valeurs
            index_ligne = 1
            Using lirecsv As New Microsoft.VisualBasic.FileIO.TextFieldParser(fichier)
                lirecsv.SetDelimiters(séparateur)
                While Not lirecsv.EndOfData 'tant que pas fin de fichier
                    colonnes_de_la_ligne = lirecsv.ReadFields() ' on lit tous les champs de la ligne en cours
                    'élimine la premiére ligne si c'est la ligne des titres
                    If Not ligne_de_titre Then ' au premier cycle on ne fait rien
                        valeurs_lus(index_ligne) = (colonnes_de_la_ligne(num_col))
                        index_ligne += 1
                    End If
                    ' mise à vrai lorsque la premiére ligne est passé
                    ligne_de_titre = False
                End While
                ' transfert de la lecture
                Return valeurs_lus
            End Using
        Else
            valeurs_lus(0) = "impossible de trouver le fichier"
        End If
fin:
        Return valeurs_lus
    End Function

Conclusion

        ' utilisation de la fonction
        Dim monfichier As String = Application.StartupPath & "\testsTOR.csv" 'chemin du fichier
        Dim resultat() As String

        resultat = lire_colonne_CSV(monfichier, ";", False, 1)
        If resultat(0) = "ok" Then 'affichage des résultats si la colonne est bien rempli
            For a As Integer = 1 To resultat.Length - 1
                RichTextBox1.Text += resultat(a) & vbCrLf
            Next
        Else : MsgBox(resultat(0))
        End If
 

Historique

01 octobre 2007 09:32:44 :
Rajout du traitement d'erreur par retour d'un code. 0 = OK 1 = pas trouvé fichier 2 = pas trouvé colonne merci PCPT. Transfert sur Codyx ;)
02 octobre 2007 08:39:20 :
correction suite à remarque de PCPT (integer dans un string).

Commentaires et avis

signaler à un administrateur
Commentaire de PCPT le 29/09/2007 20:45:49 administrateur CS

salut,
ta fonction retourne un msgbox en cas d'erreur? pas très modulable...

de plus ce code aurait bien plus sa place sur www.Codyx.Org (même login pass)

signaler à un administrateur
Commentaire de Adn56 le 30/09/2007 14:17:34

salut, ben on peux lui faire faire autre chose, style ouvrir un dirlistbox, mais pour l'erreure des colonnes, a part faire un test tant que pas colonne valide je vois pas ;)

dsl pour le codyx, je suis pas encore abitué ^^

signaler à un administrateur
Commentaire de PCPT le 30/09/2007 14:32:04 administrateur CS

oui "on peut faire" ce qu'on veut, mais le principe de la fonction est de retourner qqc.
donc ne rien retourner et afficher un msg, pour une fonction c'est moyen. c'est le code appelant qui doit afficher le message ou faire qqc si la fonction ne retourne pas ce qui est attendu

signaler à un administrateur
Commentaire de Adn56 le 30/09/2007 18:32:34

ah ok, donc il faudrait que je fasse un integer en plus qui retourne le status de la lecture par exemple ?
Public  Function lire_colonne_CSV(ByVal fichier As String, ByVal séparateur As String, ByVal ligne_de_titre As Boolean, ByVal num_col As Integer) As String() as integer

et dire au lieu des msgbox : error =0 ou 1 ou 2
0=ok, 1=fichier pas trouvé et enfin 2=colonne hors limite.
return error.
mieux comme cela ? si oui je repost sur codix la version corrigé ^^ (et si ya d'autre chose avant de le faire dis le moi, je débarque sur les fonctions MDR. ++ et merci du conseil

signaler à un administrateur
Commentaire de PCPT le 30/09/2007 19:43:36 administrateur CS

c'est bien à çà que je fais allusion oui

sauf que... même en DotNet j'suis pas sur qu'un retour "As String() as integer" soit accepté
çà serait plus "Public  Function lire_colonne_CSV(ByVal fichier As String, ByVal séparateur As String, ByVal ligne_de_titre As Boolean, ByVal num_col As Integer, ByRef lFunctionReturn as Integer) As String()"

ou bien "Public  Function lire_colonne_CSV(ByVal fichier As String, ByVal séparateur As String, ByVal ligne_de_titre As Boolean, ByVal num_col As Integer, ByRef aResult() as String) As Integer"


++ ;)

signaler à un administrateur
Commentaire de Adn56 le 01/10/2007 09:45:59

voila ^^ j'ai préféré utiliser le premier champs du tableau retourné par la fonction pour faire un status (0=ok, 1 ou 2 défaut). tu en penses quoi ?
Merci de ton aide.

signaler à un administrateur
Commentaire de PCPT le 02/10/2007 01:24:24 administrateur CS

beh j'en pense que des entiers vers un type chaine c'est pas extra :s

signaler à un administrateur
Commentaire de Adn56 le 02/10/2007 07:28:38

ah bon ? ben ca marche toujours, sinon il faut rajouter des "" non ? style :
valeurs_lus(0) = "1" ' et voila un entier_txt (j'ai bon ?)
merci et ++

signaler à un administrateur
Commentaire de Adn56 le 02/10/2007 08:46:15

mise à jour, merci

signaler à un administrateur
Commentaire de PCPT le 02/10/2007 10:18:27 administrateur CS

c'est pas que çà marche....
1+1=2  => OK
"1"+"1"="2"  => euh.. pas trop non ^^

signaler à un administrateur
Commentaire de Adn56 le 02/10/2007 10:54:07

biensur lol, mais comme je reste en string, j'ai carrément écrit le type de défaut dans resultat(0) c'est encore mieux ^.^, merci de ton aide, je pense que là, la fonction doit etre pas mal (à part la premiére boucle pour lire le nombre de ligne total, ça c'est pas top) ++

signaler à un administrateur
Commentaire de polgornek le 06/10/2007 10:30:59

Sinon, le bon vieux throw new exception(MyErrorMsg) est pas mal aussi... en insérant la fonction dans un bloc try ... catch?

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

scinder des cellules excel [ par lebleu ] j'ai un fichier ckient dans lequel j'ai besoin de scinder la colonne titre+nom+prenom en une colonne titre, une colonne nom et une colonne prenom...je tester si colonne d'un classeur Excel est vide [ par J-F ] Bonjour, Quelqu'un sait-il comment tester si la colonne d'un classeur Excel est vide?Merci,J-F sélection de deux plages d'une même colonne dans Excel [ par J-F ] Bonjour,Je dois créer une fonction pour calculer une autocorrélation à partir d'une colonne Excel. Pour ce faire, je dois sélectionner un range avec l copie d'une colonne d'un fichier excel a un autre. [ par gsu ] Comment faire pour ouvrir un fichier excel du meme nom que celui actif (date de l'enregistrement via une inputbox),copier une colonne et la coller dan importer une colonne excel dans une listbox [ par Patou ] Bonjour je suis totalement novice avec vb, et mon premier problème (déjà) est d'insérer une série de nombre dans une listbox. Merci de vos réponses. Importation d'un fichier Excel sous access avec VBA [ par Cassidy ] OK, je sais utiliser l'assistant d'importation de feuilles de calcul, mais ce que je voudrais c'est pouvoir faire la même chose en vba.Au pire, je sai Pro en Excel :P [ par stage ] Bon voici le probleme !Au départ, j'ai un fichier au format .txt que je dois ouvrir avec excel. Je veux ouvrir ce fichier texte la en lui mettant des Remplacer dans une colonne Excel [ par stage ] A partir de vb, comment on fait pour remplacer dans une colonne Excel.Exemple:de C5:C200je veux remplacer les x par des o Comment creer un tableau excel qui m'aficherai les vendredi dans 1 colonne [ par Baboune ] Salut, je suis débutant en VBA.J'aimerai créer un tableau sous Excel dans lequel la première colonne afficherai tous les vendredi d'une période donnée Excel : [ par seb ] Bonjour et merci à ceux qui m'ont répondu la dernière fois ! J'ai un petit problème à vous soummettre, toujours avec Excel ( ah, toujours les chiffr


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,27 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.