begin process at 2012 02 16 16:28:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Texte

 > LIRE UNE COLONNE DANS UN CSV (FUNCTION)

LIRE UNE COLONNE DANS UN CSV (FUNCTION)


 Information sur la source

Note :
Aucune note
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 :10 527

Auteur : Adn56

Ecrire un message privé
Site perso
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).

 Sources du même auteur

Source .NET (Dotnet) AMUSONS NOUS AVEC UN LABEL ^^
Source avec Zip Source .NET (Dotnet) EXEMPLE DU TUTORAIL "CLASSES MÉTIER"
Source avec Zip Source avec une capture Source .NET (Dotnet) COMPTE_BANCAIRE.NET
Source avec Zip Source avec une capture Source .NET (Dotnet) LECTEUR DE CSV GRACE À ZEDGRAPH
Source avec Zip Source .NET (Dotnet) DLL POUR K8055 (VM110) UTILISATION SIMPLIFIÉE DE CETTE CARTE

 Sources de la même categorie

Source avec Zip Source avec une capture MASQUE DE SAISIE NUMÉRIQUE par acive
Source avec Zip Source .NET (Dotnet) COMPTEUR DE NOMBRE DE MOTS DANS UN TEXTE par alpha5
Source avec Zip Source avec une capture HM - BLOCNOTE par hassenmajor
Source .NET (Dotnet) [VB.NET] CLASS DE COLORATION SYNTAXIQUE "ON THE FLY" par huzima
Source avec Zip Source avec une capture PERSONNALISEZ VOS BOÎTES DE MESSAGE (X)HTML par medjahedScript

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) EXPORTER LES IMAGES DE WORD ET D' EXCEL par Le Pivert
Source avec Zip Source avec une capture MANIPULER LES FENETRES ENFANT D'EXCEL par bigfish_le vrai
Source avec Zip Source avec une capture COLLECTION ID par Le Pivert
EXCEL: CONVERTIR UNE COLONNE EN CHIFFRE OU CARACTÈRE par Fabian
CONVERTIT UN NR DE COL. ET DE LIGNE EN CELLULE EXCEL par ols

Commentaires et avis

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)

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é ^^

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

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

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"


++ ;)

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.

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

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

Commentaire de Adn56 le 02/10/2007 08:46:15

mise à jour, merci

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

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) ++

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

[Catégorie modifiée VB6 --> VBA] excel Changer de colonne quand touche virgule pressé [ par sonataIII ] Salut à tous Sur excel, je cherche à passer à la colonne de droite quand la touche virgule est relaché ? PS: je métrise pas vba merci d'avance. [Catégorie modifiée .Net --> VBA] Tableau croisé dynamique - Excel [ par Adikt73 ] Bonjour, J'ai une base de données (Excel 2003) sur laquelle figurent les colonnes ci-après: 1ère colonne: noms et prénoms des résidents 2ème colonne parcourir colonne excel VBA [ par siham2010 ] Bonjour, j'ai un userform où j'ai deux textbox pour entrer les date et un bouton test. quand je clique sur le bouton test, il faudrait qu'il m'affich copier de excel vers txt [ par truebenja ] Bonjour, Je tente depuis des jours de monter une macro sans succès J'aurais aimé pouvoir copier le contenu d'un tableau excel (qui ne contient qu'un aide macro excel [ par komanvi ] slt le forum bonne et heureuse annee a toussssssssssss je suis komanvi et je penche encore vers vous pour une aide en faite j'ai un colonne dans la q VBA sur tableau word comme sur excel [ par jacky1002 ] Bonjour à tous, certains me connaisse déjà car j'ai eu recours a vos connaissance il y a à poeu près un an lors d'un stage ou je voulais mettre en pl Combobox sous excel [ par joybach ] Bonjour, j'ai un petit soucis, Voila je suis vraiment débutant dans le VBA, et en fait, je voudrais créer une petite interface graphique avec 3 liste [Catégorie modifiée VB6 -> VBA] Macro sous Excel [ par LWO ] Bonjour à tous, Novice en VBA mais j'apprends vite. Je cherche un code pour alimenter les cellules d'une colonne par une valeur et ce autant de fois Excel [ par Liro ] bonjour à tous, J'ai une feuille avec une MFC (mise en forme confitionnelle) texte en rouge et en gras si différent de la colonne d'à côté. Je souhai calcul sue excel [ par haykoula1984 ] bonjour, je veux écrire un code qui suivant le contenu de la case de la 4 ème colonne(D) et la 5 ème colonne(E) : il fait le produit sur la même ligne


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 13,837 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales