Lire une colonne dans un csv (function)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 387 fois - Téléchargée 19 fois

Contenu du snippet

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 / 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()
        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

A voir également

Ajouter un commentaire

Commentaires

Messages postés
5
Date d'inscription
mercredi 5 novembre 2003
Statut
Membre
Dernière intervention
6 octobre 2007

Sinon, le bon vieux throw new exception(MyErrorMsg) est pas mal aussi... en insérant la fonction dans un bloc try ... catch?
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
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) ++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
c'est pas que çà marche....
1+1=2 => OK
"1"+"1"="2" => euh.. pas trop non ^^
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
mise à jour, merci
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
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 ++
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.