IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Lister le nombre de lignes d'une section d'un fichier ini [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Analyste Service Client
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste Service Client
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Par défaut Lister le nombre de lignes d'une section d'un fichier ini
    Bonjour,

    Je développe un programme pour ma boîte sur le logiciel Visual Basic 2008 Express.

    Je bloque sur un problème de détection du nombre de ligne dans un fichier ini.

    Mon fichier Ini s'appelle Cassio.ini, il contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    [NomEmployésService1]
    Employé1=xxxxxxxx
    Employé2=xxxxxxxx
    Employé3=xxxxxxxx
    Employé4=xxxxxxxx
    Employé5=xxxxxxxx
    Employé6=xxxxxxxx
    Employé7=xxxxxxxx
    Employé8=xxxxxxxx
     
    [NomEmployésService2]
    Employé1=xxxxxxxx
    Employé2=xxxxxxxx
    Employé3=xxxxxxxx
    Employé4=xxxxxxxx
    Employé5=xxxxxxxx
    Employé6=xxxxxxxx
    Employé7=xxxxxxxx
    Employé8=xxxxxxxx
     
    [FichierExcel]
    Stat_Flux=c:\xxxxxxx.xls
    Planning_Congés=c:\xxxxxxx.xls
    Le but étant d'aller chercher les lignes du tableau de congé du service correspondant au nom des employés du fichier ini.
    La connexion avec le fichier Excel est impeccable, j'ai fais l'incrémentation des colonnes, je detecte tout ce qu'il faut dans les cellules.

    Il ne me reste plus qu'a obtenir le nombre d'employés du service pour effectuer quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    For i = 0 To 120
         For j = 1 To NbrSection
                If (x2WorkSheet.Cells("B" & i).Value = LireINI("[NomEmployésService1]", "Employé" & j)) Then
                    'Ma boucle de test sur les cellules de la ligne 
                End If
          Next j
    Next i
    For i = 0 To 120
          For j = 1 To NbrSection
     
                If (x2WorkSheet.Cells("B" & i).Value = LireINI("[NomEmployésService2]", "Employé" & j)) Then
                    'Ma boucle de test sur les cellules de la ligne 
                End If
          Next j
    Next i
    Mais avec

    Et la je bloque.


    Pour l'instant mon module contient la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Module MyModule
     
        Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As System.Text.StringBuilder, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
     
        Function LireINI(ByVal Entete As String, ByVal Variable As String) As String
            Dim file = Application.StartupPath & "Cassio.ini"
            Dim Deff As String = ""
            Try
                Dim StrBuild As New System.Text.StringBuilder(90)
                Dim Ret As Integer = GetPrivateProfileString(Entete, Variable, Deff, StrBuild, 90, file)
                Return StrBuild.ToString
            Catch
                Return Deff
            End Try
        End Function
     
        Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer

    J'arrive donc a lire une valeur d'une section mais aucune idée pour detecter le nombre de ligne d'une section.
    Ce qui me permettrait de chercher des lignes Excel contenant chaque nom d'employé d'un service.

    Un algo de ce que je voudrait faire serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Debut
     
        Lire Fichier ini
        NbrLigne = 0
        Pour valeur[1] de Section1 jusqua valeur[max] de Section 1 Faire
             NbrLigne += 1
        FPour
    Fin
    J'ai eu beau chercher sur les tutos et autres, très peu parle de fichier ini et encore moins du problème en question.

    Pouvez-vous m'aider ?

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 199
    Billets dans le blog
    1
    Par défaut
    Plutôt que de passer par les API de gestion de fichiers INI, je me contenterais de lire le fichier INI comme un simple fichier texte.

    Dans une première boucle de ReadLine(), tu recherches ta section.

    Ensuite, tu boucle de nouveau avec des ReadLine()
    => Si la ligne.Trim() ne commence pas par "#" et est plus longue que 0, alors c'est une entrée, donc tu incrémentes ton compteur.
    => Accessoirement, en même temps tu peux faire un Split('=')[1] sur la ligne pour récupérer le nom de ton employé.

    Et c'est terminé
    (et du coup, t'as pas besoin de savoir combien il y a de lignes dans ta section )

  3. #3
    Membre averti
    Homme Profil pro
    Analyste Service Client
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste Service Client
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Par défaut
    Déjà, merci pour ta réponse rapide StringBuilder !

    J'ai hésité à faire quelque chose comme ça, ce que je faisait pour un précédent programme mais ça ne plait pas à mon chef, qui veut que j'utilise les fonctions de détection des sections des fichier INI...

    Pourquoi faire simple...

    Sinon j'essaierais de le passer discrétement en disant que j'y suis arrivé et en lui présentant uniquement le programme fini, mais je t'avouerais que ça me plaît moyen également et j'aime bien avoir quelque chose de propre.

    Sinon autant tout mettre dans un fichier .txt ou même .doc carrement

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 199
    Billets dans le blog
    1
    Par défaut
    Dit à ton chef que les fichiers INI, c'était à la mode à l'époque de Windows 16 bits.

    Qu'avec Windows 32 bits, ça a été remplacé par la base de registres.

    Et qu'avec l'avènement du XML, ça a été définitivement remplacé par des fichiers XML, plus facilement manipulables.

    Bref, je suis même étonné qu'on n'aie pas encore de warning à la compilation quant à une prochaine dépréciation des API de gestion de fichiers INI... C'est juste bon à mettre dans les musées à côté du Goupil (ça date de la même époque...)

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Sinon pour lire des fichiers INI, tu peux utiliser la classe IniFile de Dvp.NET

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var iniFile = new IniFile(fileName);
    foreach(var sectionName in iniFile.Sections.Keys)
    {
        Console.WriteLine("Section: {0}", sectionName);
        foreach(var entry in iniFile.Sections[sectionName])
        {
            Console.WriteLine("{0} = {1}", entry.Key, entry.Value);
        }
    }

  6. #6
    Membre averti
    Homme Profil pro
    Analyste Service Client
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste Service Client
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Par défaut
    @StringBuilder : Oui mais les banques ne sont pas connu pour la jeunesse de leur SI mais plutot pour l'avoir adaptés aux nouvelles technologies.
    Concernant les warnings, je croise les doigts alors

    @tomlev : Ok je teste cette après-midi et je fais un retour ici !

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Bref, je suis même étonné qu'on n'aie pas encore de warning à la compilation quant à une prochaine dépréciation des API de gestion de fichiers INI...
    Bah le compilo C# n'est pas supposé avoir connaissance des API natives de Windows... donc ça m'étonnerait qu'on voit un jour ce genre de warning

  8. #8
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 199
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bah le compilo C# n'est pas supposé avoir connaissance des API natives de Windows... donc ça m'étonnerait qu'on voit un jour ce genre de warning
    Oui, mais rien ne nous permet d'affirmer que dans la prochaine version de Windows, ces API existerons encore.

    Donc certes, pas de Warning, mais ça compilera/exécutera plus du tout, c'est guère mieux

  9. #9
    Membre averti
    Homme Profil pro
    Analyste Service Client
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste Service Client
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Par défaut
    Donc après traduction de ton C#, ca me donne un truc comme ça dans ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function INInew(ByVal sectionName As String)
            Dim FichierINI = New Developpez.Dotnet.Configuration.IniFile("Cassio.ini")
            For Each sectionName In FichierINI.Sections.Keys
                MsgBox("Section: {0}" & sectionName)
                For Each entry In FichierINI.Sections(sectionName)
                    MsgBox("{0} = {1}", entry.Key, entry.Value)
                Next
            Next
        End Function
    J'ai ajouté le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Imports Developpez.Dotnet.Configuration.IniFile
    Et toutes les références des dll du paquet Developpez
    Avec un beau Warning :
    La fonction 'INInew' ne retourne pas une valeur pour tous les chemins de code. Une exception de référence null peut se produire au moment de l'exécution lorsque le résultat est utilisé.
    Ce qui n'est pas génant lors de l'execution a priori (pas d'erreur), sauf que je n'ai rien qui s'affiche, mes msgbox ne s'affichent pas car il ne rentre jamais dans le premier for each.

    Ais-je mal compris le principe de ton code ou carrement de la classe IniFile ?

  10. #10
    Membre averti
    Homme Profil pro
    Analyste Service Client
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste Service Client
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Par défaut
    Je n'ai aps l'impression que le lien se fait avec mon fichier ini qui pourtant est au bon endroit, car en ajoutant une section via le FichierINI.AddSection je ne la retrouve dans le fichier ini

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Faufoll Voir le message
    Avec un beau Warning :
    Bah ça devrait être une Sub, pas une Function, puisque ça ne renvoie pas de valeur...

    Citation Envoyé par Faufoll Voir le message
    Ce qui n'est pas génant lors de l'execution a priori (pas d'erreur), sauf que je n'ai rien qui s'affiche, mes msgbox ne s'affichent pas car il ne rentre jamais dans le premier for each.
    Où as-tu appelé la méthode ININew ? Mets un point d'arrêt dedans pour vérifier qu'elle est bien appelée

  12. #12
    Membre averti
    Homme Profil pro
    Analyste Service Client
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste Service Client
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Par défaut
    Pour le Sub, j'avais réfléchi entre temps et j'ai effectivement mis un sub.
    j'avais mis une Fonction car j'aurais besoin que ça en soit une plus tard.

    J'ai appellé ININew à l'appui d'un bouton dans une form tout ce qu'il y a de plus classique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyModule.INInew("NomEmployés")
    J'ai même enlevé toutes mes requetes sur fichier excel pour n'avoir que ça dans la form mais toujours pareil, cela ne rentre pas dans la boucle et si je met juste un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(FichierINI.GetValue("NomEmployés", "Employé1"))
    Avant la boucle ça me ressort une valeur vide.

    J'ai réduit mon code à :

    Mon module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Imports System.Object
    Imports System.Runtime.InteropServices.Marshal
    Imports Developpez.Dotnet.Configuration.IniFile
     
    Module MyModule
        Sub INInew(ByVal sectionName As String)
            Dim FichierINI = New Developpez.Dotnet.Configuration.IniFile("C:\Cassio.ini")
            MsgBox(FichierINI.GetValue("NomEmployés", "Employé1"))
            For Each sectionName In FichierINI.Sections.Keys
                MsgBox("Section: {0}" & sectionName)
                For Each entry In FichierINI.Sections(sectionName)
                    MsgBox("{0} = {1}", entry.Key, entry.Value)
                Next
            Next
        End Sub
    End Module
    Mon bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            MyModule.INInew("NomEmployés")
        End Sub

    Alors soit mon visual basic 2008 se fout effrontément de moi soit je m'a gourré mais je penche pour la première quand même

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bizarre, je ne vois pas pourquoi ça ne rentre pas dans la boucle...

    Citation Envoyé par Faufoll Voir le message
    si je met juste un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(FichierINI.GetValue("NomEmployés", "Employé1"))
    Avant la boucle ça me ressort une valeur vide.
    Il n'y a pas de section "NomEmployés"... il y a "NomEmployésService1", "NomEmployésService2", mais pas "NomEmployés" tout court.

    Quel est l'encodage de ton fichier au fait ? Il y a quelquefois des problèmes avec les accents si le fichier n'est pas en UTF-8...

  14. #14
    Membre averti
    Homme Profil pro
    Analyste Service Client
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste Service Client
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Par défaut
    En fait le nom des sections est bien mis c'est juqte que j'ai même pas le droit de diffuser le nom du service sur le net (genre vous allez en faire quelque chose...)

    Check fait sur le fichier en supprimant les é : ça marche, enfin j'arrive a le lire et il rentre dans la première boucle ! Merci beaucoup, ça m'aurait même pas effleurer l'esprit même si j'ai souvent ce problème d'accent avec la conversion français-anglais.

    Par contre j'ai une erreur de conversion de chaine string en integer mais je pense pouvoir gérer ça.

    J'avance !

  15. #15
    Membre averti
    Homme Profil pro
    Analyste Service Client
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste Service Client
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Par défaut
    Ok, c'est tout bon, grâce à ton code, et a la classe INIFile j'ai tout ce qu'il me faut pour finir.

    Merci beaucoup tomlev !

    Je passe en résolu le topic du coup

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Faufoll Voir le message
    Check fait sur le fichier en supprimant les é : ça marche, enfin j'arrive a le lire et il rentre dans la première boucle ! Merci beaucoup, ça m'aurait même pas effleurer l'esprit même si j'ai souvent ce problème d'accent avec la conversion français-anglais.
    Essaie plutôt de changer l'encodage du fichier en UTF-8, comme ça tu pourras garder les accents... Le bloc-notes de Windows ne propose pas cette option, mais la plupart des autres éditeurs (Notepad2, Notepad++, Visual Studio etc) le permettent.

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    En tous cas ton expérience m'a fait prendre conscience du problème, j'ai donc ajouté une surcharge du constructeur qui permet de spécifier l'encodage à utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Lire avec l'encodage ANSI par défaut (ISO-8859-1)
    Dim FichierINI = New Developpez.Dotnet.Configuration.IniFile("C:\Cassio.ini", Encoding.Default)
    Ce sera dans la prochaine version de la lib

    Si tu veux utiliser la modif sans attendre la prochaine version (pas avant quelques mois a priori...), tu peux trouver la source ici. Ou tu peux aussi faire un checkout complet du projet via SVN à partir de cette URL.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/08/2008, 15h29
  2. Lire le nom d'une section d'un fichier INI
    Par Flow_75 dans le forum C++Builder
    Réponses: 1
    Dernier message: 09/02/2007, 22h01
  3. Réponses: 5
    Dernier message: 22/08/2006, 10h35
  4. Comment écrire une section dans un fichier ini?
    Par Jayceblaster dans le forum Delphi
    Réponses: 5
    Dernier message: 26/06/2006, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo