Fonction qui permet de lire un champ dans un csv en fonction de sa ligne et de sa colonne.

Soyez le premier à donner votre avis sur cette source.

Vue 11 190 fois - Téléchargée 636 fois

Description

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

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_JACKY007
Messages postés
24
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
1 décembre 2010

C'est bien compliqué pour une si petite chose...
1er étape : lire le fichier.
Conseil pour commenser, utilise les extraits de codes !!!
Celui-ci nous donne :
Dim fileContents As String
fileContents = My.Computer.FileSystem.ReadAllText("C:\Test.txt")
Ensuite on pointe sur la ligne :
dim ligne As string = fileContents.split(separateurLigne)(Ligne)
Généralement, separateurLigne=vbLf : tu peux le mettre dans la fonction en optionnal. Cela te permettra de l'utiliser plus tard pour d'autres choses

Puis sur notre champ :
dim champ As string = ligne.split(separateurColonne)(Colonne)
return champ
Fini !
En 3 lignes (sans la gestion d'erreur) tu as le résultat...
Pour ce qui est de du nombre de lignes et de colonnes tu peux rajouter des UBound sur les tableaux (il te faudra 2 lignes de plus!)
Dernier conseil : place ta fonction dans tes extraits de codes pour la réutiliser plus tard.
Sinon ton code est propre, bien aéré et commenté.
Bonne chance pour la suite.
Respectueusement.
Solenoyde
Messages postés
14
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
4 février 2008

Ah merci pour ce commentaire !

C'est vrai que la fonction est un peut longue pour ce quelle fait hehe ...
et cette petite ligne 'dim ligne As string = fileContents.split(separateurLigne)(Ligne) ma l'air bien sympa.

Je vais donc essayer d'appliquer votre conseil et encore merci, car sans crtitiques on progresse pas beaucoup tout seul...

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.