Lire un fichier .ini qui possède pour chaque rubrique plsieurs clés identiques q [Résolu]

bertchini 6 Messages postés lundi 4 décembre 2000Date d'inscription 28 mars 2008 Dernière intervention - 4 mars 2008 à 15:58 - Dernière réponse : cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention
- 6 mars 2008 à 19:29
Bonjour ou bonsoir à tous,

Je me tourne de nouveau vers vous dans l'espoir que vous puissiez me guider vers la lumière.
Voilà mon problême!
Je travaille en VBA sur un logiciel de dessin industriel (AutoCad)
Je possède un fichier "MonFichier.ini" comportant plusieurs rubriques.
Pour chaque rubrique, j'ai une et une seule clé qui peut prendre différente valeur. Je m'explique :

   [Truc]
   bidule=machin, bidule,chouette (Machin, bidule et chouette initialiseront chacun un objet)
   bidule=maman, papa, gateau
   bidule= chose, machin, truc
   ...

   [poulet]
   fraise=...
   ...

Je souhaite pouvoir lire se fichier .ini en l'insérant dans une liste (chaque rubrique dans une liste spéciale) , c'est à dire une ligne pour chaque valeur de clé et un élément par colonne.

Merci d'avance pour l'aide et le soutient que vous m'apporterez.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 5 mars 2008 à 14:29
3
Merci
Re,
essie ceci

Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias _
   "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString _
   As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Public Function ReadSection(ByVal SectionName As String, ByVal FileName As String) As String()
Dim Buffer As String
Dim NbCar As Integer

   ' Lecture du nombre de caractères de la section (32767 est le maximum)
   Buffer = String(32767, 0)
   NbCar = GetPrivateProfileSection(SectionName, Buffer, Len(Buffer), FileName)
   
   ' Lecture des clés de la section
   Buffer = String(NbCar + 1, 0)
   NbCar = GetPrivateProfileSection(SectionName, Buffer, Len(Buffer), FileName)
   'on retourne le contenu de la section
   ReadSection = Split(Buffer, Chr(0))
   If UBound(ReadSection) > 1 Then
       ReDim Preserve ReadSection(UBound(ReadSection) - 2)
   Else
       Erase ReadSection
   End If
End Function<hr />, ----
[code.aspx?ID=41455 By Renfield]

Il faudra surement la modifier un peu mais elle fonctionne
@+: Ju£i?n
Pensez: Réponse acceptée

Merci jrivet 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de jrivet
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 4 mars 2008 à 16:14
0
Merci
Salut,
Regarde GetPrivateProfileSection qui te permet de lire une section entiere.
cette API te retournera donc d'un coup tout [Truc] par exemple

@+: Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 4 mars 2008 à 18:35
0
Merci
Salut
Comme le dit JRivet, les fichiers INI ne sont pas des fichiers texte comme les autres.
Ils ont une quelques instructions dédiées pour lire directement les Item des Catégories qui sont entre crochets :

Il est bizarre que plusieurs Item aient le même nom 'bidule'.
Est-ce toi qui a créé ce fichier ou bien AutoCad ?
Si c'est toi, fais en sortie que chaque Item soit unique, simplement en ajoutant un chiffre derrière, par exemple.
   GetPrivateProfileSection
   GetPrivateProfileSectionNames
   GetPrivateProfileString
   WritePrivateProfileString
   WritePrivateProfileSection
+ regarder dans l'aide de ces fonctions

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 5 mars 2008 à 13:45
0
Merci
salut,

c'est bien beau les API mais avec plusieurs libellés identiques, çà va pas être facile....

le mieux reste encore de charger le fichier complet et de travailler ensuite sur le tableau

en VB6 (pas VBA mais presque pareil) çà donne à peu près....

Option Explicit
Private Type tINI
    Section As String
    Lib     As String
    Value   As String
End Type

Private Sub Form_Load()
    Dim i As Integer, tRet() As tINI
    tRet = GetFakeIni("C:\faux_MonFichier.ini")
    
    For i = 0 To UBound(tRet)
        Debug.Print tRet(i).Section & "." & tRet(i).Lib & " ##
" & tRet(i).Value
    Next i
    
    Unload Me
End Sub

Private Function GetFakeIni(ByVal sPath As String) As tINI()
'   va retourner un tableau
tINI (SECTION / LIBELLé / VALEUR)

'   récup
fichier complet en enlevant les espaces inutiles
    Dim FF       As Integer
    Dim sLine    As String
    Dim i        As Integer
    Dim sSection As String
    Dim tRet()   As tINI
    Dim iPos As Integer
    
    FF = FreeFile
    i = 0
    
    Open sPath For Input As #FF
        Do Until EOF(FF)
            Line Input #FF, sLine
            sLine = Trim$(sLine)
            If LenB(sLine) Then
'               ligne pas vide,
on retravaille
                If InStr(1, sLine, "[") = 1 Then
'                   section
                    sSection = MyMid(sLine, "[", "]")
                Else
'                  
lib/valeur
                    iPos = InStrB(1, sLine, "=")
'                   pas "=" ? pas
valide
                    If iPos Then
                        ReDim Preserve tRet(i)
                        tRet(i).Section = sSection
                        tRet(i).Lib = LeftB$(sLine, iPos - 1)
                        tRet(i).Value = RightB$(sLine, LenB(sLine) - iPos - 1)
                        i = i + 1
                    End If
                End If
            End If
        Loop
    Close #FF

    GetFakeIni = tRet
    Erase tRet
    
End Function

'  
http://www.codyx.org/snippet_recuperer-chaine-inconnue-placee-entre-deux-chaines-connues_334.aspx#1043
Private Function MyMid(ByRef Expression As String, sLeft As String, sRight As String, Optional Start As Long = 1) As
String
    Dim lPosL As Long, lPosR As Long
    lPosL = InStr(Start, Expression, sLeft): lPosR = InStr(lPosL + 1, Expression,
sRight)
    If lPosL > 0 And lPosR > 0 Then
        MyMid = Mid$(Expression, lPosL + Len(sLeft), lPosR - lPosL - Len(sLeft))
    Else
        MyMid = vbNullString
    End If
End Function

restera plus (selon tes besoins) qu'à vérifier dans le tableau toutes les valeurs pour section=XXX et libelle=YYY

++
PCPT  [AFCK]
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
bertchini 6 Messages postés lundi 4 décembre 2000Date d'inscription 28 mars 2008 Dernière intervention - 5 mars 2008 à 14:21
0
Merci
Salut, merci pour vos réponses.


Maintenant tous les items contenu dans la section sont différents.


Je cherche à utiliser GetPrivateProfileSection. J'ai compris qu'il fallait le déclarer mais je ne sais pas comment récupérer la collection.
J'ai essayé 
   Dim Bâteau as collection
   Dim retour as string
   Collection=GetPrivateProfileSection("Truc", retour, , MonFichier)

Je ne vous cache pas que ça ne marche pas.
Je suis désolé de vous embêté avec des choses aussi simple mais ça fait qu'une semaine que je fait du VBA parce que mon patron m'a demandé de réaliser une application. Je vous cache pas que je galère un peu.

Merci d'avoir répondu et merci pour vos réponses futurs.
Commenter la réponse de bertchini
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 6 mars 2008 à 19:29
0
Merci
Re
Toutes ces infos (et exemples VB6) sur les APIs sont disponibles dans le logiciel gratuit "API-Guide" disponible http://logiciel.codes-sources.com/logiciels/API-Guide-197.aspx
Commenter la réponse de cs_Jack

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.