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 6 et antérieur Discussion :

[VB6] lire un fichier CSV en séquentiel et y écrire par ordre alphabétique


Sujet :

VB 6 et antérieur

  1. #1
    Futur Membre du Club
    Responsable services techniques
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations professionnelles :
    Activité : Responsable services techniques
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Points : 6
    Points
    6
    Par défaut [VB6] lire un fichier CSV en séquentiel et y écrire par ordre alphabétique
    Bonjour à tous,

    Comme je l'ai indiqué dans ce post, dans mon petit programme je veux lire le contenu d'un fichier en mode séquentiel.
    J'utilise donc le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fichier_agents = App.Path & "\liste_agents.txt"
    Open fichier_agents For Input As #1
    Do While Not EOF(1)
    Input #1, nom, datee, grade, chellon
    Loop
    A des fins de simplification je n'ai pas affiché ici les instructions contenues entre do et loop.


    Mon premier problème est le suivant :
    mon fichier liste_agents.txt était à la base un tableau excel que j'ai exporté en CSV avec ; (point virgule) comme séparateur.
    Cependant, je n'arrive pas à lire les champs s'ils sont séparés par un ; (point virgule). En effet le code suivant me renvoi une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Input #1; nom; datee; grade; chellon
    J'ai du les remplacer par une , (virgule). Mais cette solution ne me convient pas bien, parce que l'utilisateur de mon programme ne pourra pas modifier liste_agents avec un tableur.
    Ma question est donc la suivante : comment lire le contenu d'un fichier CSV en lecture séquentielle ?

    Mon deuxième problème (plus complique celui-là) est que je ne sais pas à l'avance le nombre de champs que va contenir chaque ligne.
    Pour l'instant, comme vous avez du le deviner en lisant mon code, ils sont au nombre de 4 :
    nom, datee, grade, chellon
    Correspondant respectivement à :
    Le nom de l'agent, sa date d'embauche, son grade actuel, son échellon actuel.

    Ultérieurement l'utilisateur de mon programme doit pouvoir enrichir cette base de donnée avec autant de renseignement qu'il le souhaite, par exemple :
    NOM ; date d'embauche ; grade ; échelon ; affectation ; habilitation 1 oui/non ; habilitation 2 oui/non ; etc ...

    Ainsi, comment lire ce fichier sans savoir combien de champ contient chaque ligne ?
    je pense qu'il me faudra utiliser lineinput, mais je ne comprends pas comment l'utiliser.


    Enfin, troisième question, dans ce même genre de fichier, comment ajouter une nouvelle ligne de façon à ce que le premier champ soit classé par ordre croissant (alphabétique ou chronologique) ?
    Si j'utilise le code suivant, la ligne va être ajouter à la fin du fichier, mais ce n'est pas ce que je veux ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open fichier_agents For append As #1
    Merci d'avance pour votre aide et vos réponses piétinantes

  2. #2
    Membre actif Avatar de petit rabot
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2010
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2010
    Messages : 236
    Points : 226
    Points
    226
    Par défaut
    J'ai un fichier texte formaté avec des ";" que je lis avec le code suivant. A toi de l'adapter pour ton programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub ReadAllLines(ByVal sPath As String, ByRef aLines() As String)
     
    Dim FF As Integer
    Dim sBuffer As String
        FF = FreeFile
        On Error Resume Next
        Open sPath For Input As #FF
            sBuffer = Input(LOF(FF), #FF)
        Close #FF
        aLines = Split(sBuffer, vbNewLine)
     
    End Sub
    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
    24
    Private Sub Form_Load()
     
        'centre au démarrage
            Form11.Left = (Screen.Width - Form11.Width) / 2
            Form11.Top = (Screen.Height - Form11.Height) / 2
     
        'lecture du répertoire
    Dim aMesLignes() As String
        On Error GoTo Erreur1
            ReadAllLines App.Path & "\" & "Répertoire.rpc", aMesLignes
            Label3.Caption = (1 + UBound(aMesLignes)) & " clients enregistrés"
            For W = LBound(aMesLignes) To UBound(aMesLignes)
                RepClients(W, 0) = aMesLignes(W)
                DecClient = Split(RepClients(W, 0), ";")
                RepClients(W, 1) = DecClient(0)
                RepClients(W, 2) = DecClient(1)
                RepClients(W, 3) = DecClient(2)
                RepClients(W, 4) = DecClient(3)
                Combo1.AddItem RepClients(W, 1)
            Next W
        Exit Sub
    Erreur1:
        MsgBox IniLit(App.Path & "\" & App.EXEName & ".ini", "ERREURS", "ERREUR1", "")
    End Sub
    "Ce n'est pas parce que les choses sont impossibles qu'il faut les accepter."

  3. #3
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    ___Ia ora na fa'ahou.
    Citation Envoyé par cantonnier Voir le message
    Mon deuxième problème [...] je pense qu'il me faudra utiliser lineinput, mais je ne comprends pas comment l'utiliser.
    ___La première étape est on ne peut plus simple : une fois le fichier ouvert en mode input, vous écrivez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Line Input #FF, MaLigne
    et l'ensemble de la ligne (entre deux sauts de ligne) sera placé dans la variable MaLigne ; le résultat est comparable à ce que fournit la procédure ReadAllLines de Petit Rabot, à ceci près que ReadAllLines renvoie l'ensemble dans un tableau, alors que Line Input doit être répété autant de fois que nécessaire.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ainsi, comment lire ce fichier sans savoir combien de champ contient chaque ligne ?
    ___Le problème est moins la lecture (voir paragraphe précédent) que l'interprétation. Sinon, à l'enregistrement, on peut toujours créer un champ vide du genre nom;date d'embauche;;échelon pour quelqu'un qui n'aurait pas de grade connu.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    troisième question, dans ce même genre de fichier, comment ajouter une nouvelle ligne de façon à ce que le premier champ soit classé par ordre croissant (alphabétique ou chronologique) ?
    Si j'utilise le code suivant, la ligne va être ajouter à la fin du fichier, mais ce n'est pas ce que je veux ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open fichier_agents For append As #1
    ___Comme suggéré dans un sujet voisin, je ne vois qu'une solution : trier les enregistrements (dont chacun forme une ligne de texte) par exemple à l'aide d'une liste (ListBox avec propriété Sorted = Vrai) puis réenregistrer le tout.
    ___D'ailleurs si le nombre de champs doit changer, il faudra bien réenregistrer le fichier à chaque ajout.


    ___Bon courage pour la suite.

  4. #4
    Futur Membre du Club
    Responsable services techniques
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations professionnelles :
    Activité : Responsable services techniques
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Le problème est moins la lecture (voir paragraphe précédent) que l'interprétation. Sinon, à l'enregistrement, on peut toujours créer un champ vide du genre nom;date d'embauche;;échelon pour quelqu'un qui n'aurait pas de grade connu.
    Oui, je susi tout à fait d'accord que le problème est plus l'interprétation que la lecture lol
    Je suis également tout à fait d'accord qu'un ligne sera composée comme suit, si l'échelon n'est pas connu :
    nom;date d'embauche;;échelon
    Cependant j'ai du mal expliqué mon problème :
    En fait, ici je n'ai besoin que de lire le nom de la personne pour l'afficher dans un checkbox. Dans la suite de mon application, outre le contenu du "premier champs" j'ai parfois besoin de lire en plus le second, voire légalement le troisième, mais les autres ne sont utilisés que par le tableur (excel ou calc) lors d'autre fonctions (calcul de cout par exemple).

    Pouvez vous m'expliquer comment faire ?
    J'ai bien pensé utiliser lineinput et split Ainsi, je pourrais lire les 3 premiers champs de mon fichier,dans des variables, et stocker le reste dans la ligne dans un string pour vouvoir le réécrire après.
    Cependant, j'ai beaucoup de mal à comprendre le fonctionnement de split.
    Quelqu'un pourrait-il m'éclairer ?

  5. #5
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    Salut
    Cependant, j'ai beaucoup de mal à comprendre le fonctionnement de split.
    Quelqu'un pourrait-il m'éclairer ?
    Comment "éclater" une chaîne dans un tableau ?
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    Futur Membre du Club
    Responsable services techniques
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations professionnelles :
    Activité : Responsable services techniques
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Impecable ! merci beaucoup.
    J'ai bataillé un peu parce que je ne comprennais pas l'histoire de tableau et d'index, mais maintenant c'est tout bon !

    Maintenant je vais me pencher sur l'écrirture par ordre chronologique.
    Ca a l'air bien plus compliqué.

    Encore merci pour votre aide

Discussions similaires

  1. Ouvrir et lire un fichier .csv
    Par Art19 dans le forum Composants VCL
    Réponses: 20
    Dernier message: 12/08/2007, 23h18
  2. Lire un fichier CSV ou XLS de la même manière
    Par Linio dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/07/2007, 15h12
  3. [VB6]Lire un fichier excel
    Par LEYLA dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 04/05/2006, 10h04
  4. Réponses: 12
    Dernier message: 12/04/2006, 10h20
  5. Lire un fichier CSV/XLS
    Par Doneve dans le forum ASP
    Réponses: 3
    Dernier message: 04/10/2005, 17h34

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