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
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.