Ce bout de code est une fonction qui permet de lire un champ dans un CSV en fonction de sa ligne et de sa colonne.
voici la forme de la fonction : (ByVal Fichier As String, ByVal Séparateur As String, ByVal Ligne As Integer, ByVal Colonne As Integer)
Pourquoi avoir fait cette fonction ?
Car je suis automaticien de formation et pour un prjet avec un automate type S7-300 connecté a un afficheur type TP277 lui meme connecté a un PC bref ... mon afficheur m'archive des variables et autres alarmes sur le PC sous forme de fichiers *.CSV donc pour faire une application conviviale avec l'utilisateur j'ai utilisé cette fonction pour aller chercher certaines données et les afficher pour consultation...
Enfin je pense que cette fonction peut etre utilisée pour des applications quelconque, tant que les fichiers sont de type texte avec séparateur.
Pour finir en cherchant un peu je n'ai pas trouvé d'equivalent, j'ai trouvé des sources qui importé une colonne complete d'un CSV dans une richbox, mais pas pratique pour récupérer la donnée... il est important de dire aussi que c'est ma première source alors j'aimerais des commentaire constructif pour m'aider a améliorer cette chose ...Voila Merci d'avance ...
(j'ai mis un fichier CSV dans le zip ... ce sera plus simple pour tester)
Source / Exemple :
Imports System.IO
Public Class Form1
Dim cptlignes As Integer
Dim cptcolonnes As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Function Read_CSV(ByVal Fichier As String, ByVal Séparateur As String, ByVal Ligne As Integer, ByVal Colonne As Integer) As String
'-------------------------------------------------------------------------------
' Fonction Read_CSV s'utilise avec une listbox nommée readCSV avec un propriété visible=false crée par vos soins
' ex: Var IHM.Recette_hmi.timeofday;01/01/1990
' Cette fonction reçoit un argument Séparateur de type string (Séparateur : , ; )...
' Cette fonction reçoit un argument Ligne de type integer (qui correspond a la Ligne lu)... "Attention la première ligne est la ligne 0 et non pas la ligne 1" (prefere laisser comme ca car ca me parrait plus logique de commencer a 0)
' Cette fonction reçoit un argument Colonne de type integer (qui correspond a la Colonne lu)... "Attention la première colonne est la colonne 0 et non pas la colonne 1"
' Elle renvoie String qui est la chaine située entre 2 séparateurs
'-------------------------------------------------------------------------------
'Chargement du CSV dans la listbox nommée readCSV
Dim Valeur As String = ""
Dim cptlignes As Integer
Dim cptcolonnes As Integer
Try
Dim Reader As New StreamReader(Fichier)
Dim Reader_line As String
Do
Reader_line = Reader.ReadLine 'Reader.ReadLine la ligne exemple toto;coucou;56;plop
readCSV.Items.Add(Reader_line) 'et on boucle pour ajouter a la listbox les ligne une/une
cptlignes = cptlignes + 1
Loop Until Reader_line Is Nothing
Reader.Close()
Catch ex As System.IO.IOException
MsgBox("Erreur d'ouverture du fichier", MsgBoxStyle.OkOnly)
GoTo fin
Catch ex As Exception 'cette exception permet d'éviter une erreur du type "La valeur ne peut pas être null. Nom du paramètre : item" a l'initialisation
End Try
'Chargement de la ligne choisie dans ListboxLine
Dim ListboxLine As String
Try
ListboxLine = readCSV.Items(Ligne).ToString
readCSV.Items.Clear()
'Recherche de la positon des séparateurs, les valeurs sont stockées dans la listbox readCSV de façon chronologiques
Dim Recherche As String
Dim Position As Integer
Recherche = Séparateur
readCSV.Items.Add("0") 'Pour permettre de venir chercher plus tard la colonne 0
Position = InStr(ListboxLine, Recherche)
readCSV.Items.Add(Position)
Do
Position = InStr(Position + 1, ListboxLine, Recherche) 'recherche dans une chaine fonction "Instr (position de départ, chaine ou l'on cherche, la chaine recherchée)"
cptcolonnes = cptcolonnes + 1
readCSV.Items.Add(Position) 'a chaque séparateur trouvé on vient l'ajouter en tant qu'item dans la list box
Loop While Position > 1
Catch ex As Exception 'cette exception permet d'éviter une erreur du type "La valeur ne peut pas être null. Nom du paramètre : item" a l'initialisation
MsgBox("Numéro de colonne ou de ligne invalide." & vbCr & "Pour information:" & vbCr & "Le fichier ne possède que " & cptlignes & " ligne(s).", MsgBoxStyle.OkOnly)
GoTo fin
End Try
'Détermine les limites en fonction du choix Colonne
Try
Dim Left As Integer
Dim right As Integer
Dim ListboxLineLength As Integer = ListboxLine.Length
Left = readCSV.Items(Colonne)
right = readCSV.Items(Colonne + 1)
'J'ai distingué 3 cas possibles 1er cas left=0 première colonne, 2eme cas left et right différent de 0, 3eme cas right=0 dernière colonne
If Left = 0 Then
Valeur = Mid(ListboxLine, 1, right - 1)
ElseIf right = 0 Then
Valeur = Mid(ListboxLine, Left + 1, ListboxLineLength - Left + 1)
Else
right = right - Left
Valeur = Mid(ListboxLine, Left + 1, right - 1)
End If
Catch ex As Exception 'cette exception permet d'éviter une erreur du type "La valeur ne peut pas être null. Nom du paramètre : item" a l'initialisation
MsgBox("Numéro de colonne ou de ligne invalide." & vbCr & "Pour information:" & vbCr & "Le fichier ne possède que " & cptlignes & " ligne(s)." & vbCr & "Le fichier ne possède que " & cptcolonnes & " colonne(s).", MsgBoxStyle.OkOnly)
End Try
'Petite comparaison un peu inutile ...
If Valeur = "" Then
Valeur = "Champ vide"
End If
readCSV.Items.Clear()
'ici possibilité de répuérer la valeurs des 2 compteurs
Label9.Text = cptlignes
Label10.Text = cptcolonnes
Return Valeur
fin:
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' On Error GoTo err
TextBox5.Text = Read_CSV(CStr(TextBox1.Text), CStr(TextBox4.Text), CInt(TextBox2.Text), CInt(TextBox3.Text))
'TextBox5.Text = Read_CSV("C:\Archive_Excel\Recette--------.csv", ";", 0, 0)
'err:
' MsgBox("Erreur de syntaxe dans la déclaration de la fonction")
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
GroupBox1.Text = TextBox1.Text
End Sub
End Class
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.