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 :

Remplacer une ligne d'un fichier texte


Sujet :

VB 6 et antérieur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Remplacer une ligne d'un fichier texte
    Salut à tous,

    J'aurais besoin d'une petite confirmation concernant l'écriture de fichiers textes .

    Je tiens à préciser qu'avant d'écrire ce qui suit, j'ai préalablement effectué quelques recherches dans l'aide de VBA ainsi que sur ce forum : j'ai trouvé pas mal d'infos, mais étant pointilleux et perfectionniste , je tiens à vérifier que je ne passe pas à coté d'une meilleure solution à mon problème .

    Problème posé : A l'aide de Visual Basic 6, je cherche à remplacer une ligne d'un fichier texte par une autre ligne de ma fabrication.

    Intérêt recherché : Je dispose d'une centaine de fichiers html contenant chacun plusieurs tableaux que je souhaite exploiter dans Access. Le programme que je suis en train d'écrire sous Access VB doit me permettre, pour chaque fichiers html situés dans un dossier prédéfinis, d'importer grâce à la commande Docmd.TransferText les tables html dont j'ai besoins.

    DoCmd.TransferText [typetransfert][, format], nomtable, nomfichier[, contientnomschamps][, nomtableHTML][, pagecode]

    Pour ceux qui ne connaissent pas cette commande, je précise qu'il est possible de choisir quelles tables de la page html peuvent être importées : il suffit de désigner la table par le titre de la page html (contenu dans les balises <TITLE></TITLE>)suivi d'un numéro désignant la deuxième, troisième, xième table de la page. Bref rien d'exceptionnel . Sauf que dans mon cas, les nom de fichiers html sont trop long (chemin+nom).

    Et alors me direz-vous ? Et bien il se trouve tout simplement que la commande Docmd.TransferText n'accepte pas des chaines de plus de 125 caractères ! Je suis sérieux, j'ai fais le test avec un nom de fichier du genre "abcde..." : au-delà de 125 caractères (chemin + nom + extension) : (Erreur 3044 : 'chemin\nom.htm' n'est pas un chemin d'accès valide. Assurez-vous que blablabla...")

    Du coup, je suis obligé de passer par un soft du style The Rename pour raccourci mes noms de fichiers. Jusque là, ça ne pose pas de problème .

    Malheureusement, les noms de fichiers des pages html servent également de titre pour ces mêmes pages. Concrêtement, une page html nommé page.htm a pour titre : page (<TITLE>page</TITLE>). Et bien evidemment la commande Docmd.TransferText ne prend pas comme nom de table valide les noms de table de plus de 63 caratères . J'ai bien vérifié avec un nom de table du genre "abcdef..." comprenant 62,63, ou 64 caractères : 62 ou 63, ca passe; au delà de 64 caractère : (Erreur : 3125 : le moteur de base de données ne peut pas trouver 'nom de la table'. Assurez-vous que le nom de paramètres ou d'alias est valide, qu'il ne comprend pas de caractères ou de ponctuation incorrecte et qu'il n'est pas trop long).

    Du coup, il m'est impossible de récupérer une table précise d'un fichier html .

    On arrive donc à ce qui me préoccupe : remplacer dans chacunes des pages html, le titre de la page par le nouveau nom du fichier de la page (créé après l'utilisation de The Rename). Ainsi le nom des fichiers et les titres des pages seront exploitables par la commande Docmd.TransferText .

    Et c'est ici que j'ai besoin de vos lumières :

    J'ai compris qu'il existe deux techniques de lecture/écriture sous VB :

    1) Les méthodes OpenTextFile ou OpenAsTextStream qui renvoient un objet TextStream utilisé sur un fichier pour lire, écrire ou ajouter du contenu. Sauf que l'aide de VB précise bien qu'ajouter signifit écrire à la fin du fichier, et qu'écrire signifit créer un fichier. Si j'écris dans un fichier existant, je l'efface. Si j'écris dans un fichier qui n'existe pas, je crée ce fichier. Si vous avez suivi, vous comprennez que ce n'est pas ça qui m'interesse .

    2) La seconde technique consite à utiliser l'instruction Open qui permet d'exécuter des opérations d'Entrées/Sorties sur un fichier. Ainsi les instructions Write et Print me permette d'écrire dans mon fichier html. Sauf qu'elles ne me permettent pas d'écrire à un endroits précis du fichier (ligne x, colonne y) et qu'aucunes instructions n'existent pour combler ce manque .

    Conscient de toute ces contraintes , je ne vois comme solutions que de copier ligne à ligne l'ensemble de mes fichiers html dans de nouveaux fichiers, en remplacant au passage le contenu des balises TITLE.

    Auriez-vous une autre solutions à me proposer ?

    Merci de m'avoir lu jusqu'au bout...

  2. #2
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    Si tu connais EXACTEMENT le texte a remplacer, et qu'il n'apparait qu'une seule fois alors j'ai une solution simple, rapide et efficace :

    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
    25
    26
    27
    28
     
    Dim Contenu As String
    Dim Adresse As String
    Dim ARemplacer As String
    Dim Remplacant As String
     
    Adresse = "C:\MyFile.Htm" 'tu met l'adresse du fichier
    ARemplacer = ""  'tu met ce qu'il faut remplacer
    Remplacant = ""  'tu met ce par quoi tu veut le remplacer
     
    'Dimensionne la variable à la taille du fichier
    Contenu=Space(Filelen(Adresse))
     
    'récupère le contenu du fichier
    Open Adresse For Binary As #1
          Get #1,,Contenu
    Close #1
     
    'Remplace une sous-chaine par une autre dans une chaine principale
    Contenu = Replace(Contenu,ARemplacer,Remplacant)
     
    'detruit le fichier
    Kill Adresse
     
    'Créer le nouveau fichier
    Open Adresse For Binary As #1
          Put #1,,Contenu
    Close #1
    La connaissance seule ne suffit pas. La vraie compréhension vient de la mise en expérience.
    Règles|FAQ|Tuto

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Salut avigeilpro,

    effectivement, je connais EXACTEMENT le texte à remplacer, donc ta technique m'a l'air parfaite.

    J'en conclu donc que l'on ne peut pas se passer de recréer chaque fichier à modifier ...

    Perso, même si c'est rapide, ça me rend malade que VBA n'intègre pas un ensemble d'instructions ou de méthodes pour se déplacer dans un fichier texte et en modifier le contenu !

    M'enfin, je vais tester ta méthode (qui a l'avantage de ne pas être du ligne à ligne) et je te tiens au courant.


  4. #4
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    Il me semble qu'en utilisant la référence FileSystemObject on peut faire enormément de chose sur les fichiers. Peut-être trouveras-tu d'autres fonctionnalités plus interressantes que la mienne. Je ne l'utilise pas donc ne peut pas t'en dire plus
    La connaissance seule ne suffit pas. La vraie compréhension vient de la mise en expérience.
    Règles|FAQ|Tuto

  5. #5
    Membre actif Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Points : 273
    Points
    273
    Par défaut
    Avec le FSO, voici ce que tu pourrais faire :

    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
    'Premièrement, il faut déclaré les objets
    Dim FSO, File
    Set FSO = CreateObject("Scripting.FileSystemObject")
    'Ensuite, voici les autres variables qui seront utile :
    Dim strContent As String, strPath As String
    strPath = "c:\chemin"
    'Ouvre le fichier, et le crée s'il n'existe pas
    Set File = FSO.OpenTextFile(strPath, 1, True)
    
    'Ceci contient le fichier au complet
    strContent = File.ReadAll
    File.Close
    'Ceci va nous être utile pour écrire
    Set File = FSO.OpenTextFile(strPath, 2, True)
    'Il faut remplacer ce que tu veux
    strContent = Replace(strContent, "Remplacer ceci", "Par celà")
    'On l'écrit, et c'est fini !
    File.Write strContent
    File.Close

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Salut à tous,

    Eh bien je vois que mon problème ne vous laisse pas indifférents ...

    Les deux techniques fonctionnent parfaitement bien, et sont aussi rapide (ou longue ) l'une que l'autre.

    Navré Thunderstroke, mais je vais suivre le conseill de Bbil et utiliser la méthode de Avigeilpro en utilisant la fonction FreeFile .

    Au passage je me suis rendu compte que je pouvais rennomer les titres des pages html avec la même valeur unique (par exemple : "Table"). Ré-utiliser le nom de fichier de la page n'est pas nécessaire. L'essentiel étant que le titre de la page soit exploitable par la commande Docmd.TransfertText .

    Pour ceux que ça interesse, voici ce que ça donne, une fois adapté à ma situation :

    1. Utilisation de Open et Write :
      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
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
          Dim FSO As Object
          Dim dossier As Object
          Dim contenuDossier As Object
          Dim fichier As Object
          Dim nomFichier As String
          Dim numFichier As Integer
          Dim contenuFichier As String
          
          Dim formatImportation As String
          Dim tableDestination As String
          Dim tableHtml As String
          Dim numTableHtml As String
          
          'constantes nécessaires
          formatImportation = "Import1"
          tableDestination = "table1"
          tableHtml = "Table"
          numTableHtml = "5"
             
          'je récupère le sous-dossier "temp"
          dans lequel se trouve les fichiers à manipuler
          Set FSO = CreateObject("Scripting.FileSystemObject")
          Set dossier = FSO.getfolder(
                        Application.CurrentProject.Path & "\temp")
          Set contenuDossier = dossier.Files
          
          'pour chacun des fichiers du dossier
          For Each fichier In contenuDossier
                      
              nomFichier = fichier.Path
          
              'dimensionne la variable à la taille du fichier
              contenuFichier = Space(FileLen(nomFichier))
              
              'récupère le contenu du fichier
              numFichier = FreeFile
              Open nomFichier For Binary As numFichier
                  Get numFichier, , contenuFichier
              Close numFichier
              
              'récupère le contenu de la balise TITLE
              titredebut = InStr(1, contenuFichier, "<TITLE>", vbTextCompare)
              titrefin = InStr(titredebut,
                           contenuFichier, "</TITLE>", vbTextCompare)
              titreseul = "<TITLE>" & Mid(contenuFichier,
                         titredebut + 7, titrefin - titredebut - 7) & "</TITLE>"
              
              'remplace le titre de la page html
              contenuFichier = Replace(contenuFichier,
                       titreseul, "<TITLE>" & tableHtml & "</TITLE>")
              
              'detruit le fichier
              Kill nomFichier
              
              'créer le nouveau fichier
              numFichier = FreeFile
              Open nomFichier For Binary As numFichier
                  Put numFichier, , contenuFichier
              Close numFichier
      
              'importation de la table html dans Access
              DoCmd.TransferText acImportHTML,formatImportation,
                 tableDestination, nomFichier, True, tableHtml & numTableHtml
          Next

    1. Utilisation du FileSystemObject :
      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
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
          Dim FSO As Object
          Dim dossier As Object
          Dim contenuDossier As Object
          Dim fichier As Object
          Dim nomFichier As String
          Dim fichierTemp As Object
          Dim contenuFichier As String
          
          Dim formatImportation As String
          Dim tableDestination As String
          Dim tableHtml As String
          Dim numTableHtml As String
          
          'constantes nécessaires
          formatImportation = "Import1"
          tableDestination = "table1"
          tableHtml = "Table"
          numTableHtml = "5"
             
          'je récupère le sous-dossier "temp"
          dans lequel se trouve les fichiers à manipuler
          Set FSO = CreateObject("Scripting.FileSystemObject")
          Set dossier = FSO.getfolder(
                     Application.CurrentProject.Path & "\temp")
          Set contenuDossier = dossier.Files
          
          Dim strContent As String, strPath As String
              
          'pour chacun des fichiers du dossier
          For Each fichier In contenuDossier
                      
              nomFichier = fichier.Path
          
               'Ouvre le fichier, et le crée s'il n'existe pas
              Set fichierTemp = FSO.OpenTextFile(nomFichier, 1, True)
              
              'récupère le contenu du fichier
              contenuFichier = fichierTemp.ReadAll
              fichierTemp.Close
      
               'récupère le contenu de la balise TITLE
              titredebut = InStr(1, contenuFichier, "<TITLE>", vbTextCompare)
              titrefin = InStr(titredebut,
                       contenuFichier, "</TITLE>", vbTextCompare)
              titreseul = "<TITLE>" & Mid(contenuFichier,
                           titredebut + 7, titrefin - titredebut - 7) & "</TITLE>"
              
              'remplace le titre de la page html
              contenuFichier = Replace(
                   contenuFichier, titreseul, "<TITLE>" & tableHtml & "</TITLE>")
              
              'Ceci va nous être utile pour écrire
              Set fichierTemp = FSO.OpenTextFile(nomFichier, 2, True)
              
              'On l'écrit, et c'est fini !
              fichierTemp.Write contenuFichier
              fichierTemp.Close
      
              'importation de la table html dans Access
              DoCmd.TransferText acImportHTML, formatImportation,
                  tableDestination, nomFichier, True, tableHtml & numTableHtml
          Next


    Encore à tous. Je laisse quelques jours le sujet ouvert au cas où certain d'entre vous auraient des choses à rajouter .

  7. #7
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    Met quand meme le tag Résolu afin que ceux que ca interesse sachent qu'il y a la solution ici. Et cela ne fermera pas le sujet pour autant
    La connaissance seule ne suffit pas. La vraie compréhension vient de la mise en expérience.
    Règles|FAQ|Tuto

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

Discussions similaires

  1. Remplacer une ligne dans un fichier texte !
    Par toulouz1 dans le forum VBScript
    Réponses: 23
    Dernier message: 19/07/2017, 10h26
  2. Remplacer une ligne d'un fichier texte par une autre
    Par devalender dans le forum WinDev
    Réponses: 12
    Dernier message: 24/07/2007, 19h51
  3. recuperer 3 float dans une ligne d'un fichier texte
    Par obiwankennedy dans le forum C++
    Réponses: 3
    Dernier message: 14/03/2006, 03h59
  4. Réponses: 5
    Dernier message: 23/12/2005, 19h19
  5. Réponses: 4
    Dernier message: 24/09/2005, 09h52

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