VB - lecture / écriture fichier txt - choix ligne

dieu08

XLDnaute Occasionnel
Bonjour les forumiteux,

Après une absence trop longue de ce forum, je reprends mes travaux en VB sur une problèmatique liée à des manipulations de lecture-écriture sur des fichiers txt.

Après quelques recherches, je suis parvenu à obtenir un script fonctionnel pour lire les données d'un fichier structuré, les stocker dans les cellules, les écrire dans un nouveau fichier txt.

Structure

VB:
Public nomfich1 As String

Type interface

    'tronc commun
    int1 As String * 8
    int2 As String * 8
    int3 As String * 8
    int4 As String * 3
    int5 As String * 6
    int6 As String * 9
    int7 As String * 2
   
    'détails mouvements
    int8 As String * 1
    int9 As String * 1
    int10 As String * 1
         
End Type

Script lecture

VB:
intFic2 = FreeFile()

NbLigne = 1

Open nomfich1 For Binary As #intFic2 Len = Len(MyInterface)

            Do While Not EOF(1)
                                           
            ' lecture fichier et repart dans les variables
                           
                               Get #intFic2, , MyInterface
                                    Cells(NbLigne, 1) = MyInterface.int1
                                    Cells(NbLigne, 2) = MyInterface.int2
                                    Cells(NbLigne, 3) = MyInterface.int3
                                    Cells(NbLigne, 4) = MyInterface.int4
                                    Cells(NbLigne, 5) = MyInterface.int5
                                    Cells(NbLigne, 6) = MyInterface.int6
                                    Cells(NbLigne, 7) = MyInterface.int7
                                    Cells(NbLigne, 8) = MyInterface.int8
                                    Cells(NbLigne, 9) = MyInterface.int9
                                    Cells(NbLigne, 10) = MyInterface.int10
                                               
            NbLigne = NbLigne + 1
                                    
            Loop
                      
Close #intFic2

Script écriture

VB:
For intFic = 1 To nbcount0

Open "infodb_test.dat" For Random As intFic Len = Len(MyInterface)

With MyInterface
    .int1 = Cells(intFic, 1)
    .int2 = Cells(intFic, 2)
    .int3 = Cells(intFic, 3)
    .int4 = Cells(intFic, 4)
    .int5 = Cells(intFic, 5)
    .int6 = Cells(intFic, 6)
    .int7 = Cells(intFic, 7)
    .int8 = Cells(intFic, 8)
    .int9 = Cells(intFic, 9)
    .int10 = Cells(intFic, 10)
End With

' compte le nombre d'enregistrements

intNum = LOF(intFic) / Len(MyInterface)
   Put intFic, intNum + 1, MyInterface
                 
Close #1

Next intFic

Mon fichier txt dispose d'une première ligne d'en-tête et les lignes suivantes sont des lignes de détails (correspondant à la structure définie dans mon script).

De ce fait, le traitement devrait être différent mais je ne parviens pas à trouver la manière d'indiquer dans le script que la ligne 1 doit être traiter sur un modèle et la ligne 2 (et éventuellement les suivantes) sur un autre modèle.

Merci pour votre aide.

Dieu08.
 

dieu08

XLDnaute Occasionnel
Je me rends compte que je ne t'ai pas expliqué le but final.

Je dispose de mon fichier d'origine et je souhaite traiter la chaîne de caractère "0000000000 00" qui début à la colonne 878 > 901 dans la seconde ligne afin de remplacer les "0" par des " ".

Il faut que la structure du fichier reste strictement identique.

Il y a peut être plus simple que toutes ces manipulations.... :confused:
 

Roland_M

XLDnaute Barbatruc
re

effectivement s'il s'agit de modifier une chaîne de caractères
tu pourrais envisager de lire le fichier complet qui n'est apparemment pas très gros
et utiliser la fonction Mid() pour modifier d'un coup l'endroit et tout recopier

Mid(Chaine, départ, Longueur) = autant de point (car je crois qu'il s'agit de ".")
L = 24
soit
Mid(Chaine, 878, L) = String(L, ".")
 

Roland_M

XLDnaute Barbatruc
re
concernant le caractères de remplacement je sais pas si c'est des vides ou un point !?
dans ton message je vois ceci "". perso j'ai mis des espaces, tu verras bien !?
Code:
' si j'ai bien compris, voici une routine pour faire des essais, ça devrait remplacer tout ton code!
' la 1'ligne est = 1574 + chr13)&chr(10) = 1576
' donc la position 878 de la 2'ligne se situe à 1576 + 878 = 2454
' sur une longueur de (878 à 901) ça fait 24 caractères !? mais ...
' perso à cette position j'ai ceci "0000000000           00 "
' donc en réalité c'est 23 caractères ! 878à900 qui sera remplacer par des espaces
'
' ton fichier.dat d'origine dans un dossier
' vérifies bien la position des données à modifier !

Sub Essai1()
Dim LenFich&, Chaine$, FichSource$, FichDestin$, Chemin$, CheminFichier$

' ici init tes propres données
Chemin$ = "E:\Téléchargements\dieu08\" ' chemin à toi de voir !? (!!! avec le \ au bout !!!)
FichSource$ = "infodb_origine.dat"     ' fichier source (origne)
FichDestin$ = "infodb_modif_rol.dat"   ' fichier destin (sauvegarde nouv.nom)

'------------- suite ne rien modifier, excepté peut être la position et/ou la longueur !?)

'load
F$ = Chemin$ & FichSource$: LenFich = FileLen(F$)
Open F$ For Input As #1: Chaine$ = Input(LenFich, #1): Close #1
'traite la chaîne
L = 23: Mid(Chaine$, 2454, L) = Space(L) ' remplace les données de la position 878à900=23 par des espaces
'save
F$ = Chemin$ & FichDestin$
Open F$ For Output As #1: Print #1, Chaine$;: Close #1 ' le ; pour ne pas rajouter un chr(13)&chr(10)
Chaine$ = ""
End Sub


EDIT: une autre version
Code:
Sub Essai2()
Dim I&, I1&, I2&, LenFich&, Chaine$, FichSource$, FichDestin$, Chemin$, CheminFichier$, Tablo As Variant

' ici init tes propres données
Chemin$ = "E:\Téléchargements\dieu08\" ' chemin à toi de voir !? (!!! avec le \ au bout !!!)
FichSource$ = "infodb_origine.dat"     ' fichier source (origne)
FichDestin$ = "infodb_modif_rol.dat"   ' fichier destin (sauvegarde nouv.nom)

'------------- suite ne rien modifier, excepté peut être la position et/ou la longueur !?

'load
F$ = Chemin$ & FichSource$: LenFich = FileLen(F$)
Open F$ For Input As #1: Tablo = Split(Input(LenFich, #1), Chr(13) & Chr(10)): Close #1
I1 = LBound(Tablo): I2 = UBound(Tablo)

'traite la 2'ligne
L = 23: Mid(Tablo(I1 + 1), 878, L) = Space(L) 'remplace les données de la position 878à900=23 par des espaces
If Right(Tablo(I2), 2) = Chr(13) & Chr(10) Then Tablo(I2) = Left(Tablo(I2), Len(Tablo(I2)) - 2)

'save
F$ = Chemin$ & FichDestin$
Open F$ For Output As #1
 For I = I1 To I2
  If Len(Tablo(I)) > 0 Then Print #1, Tablo(I)
Next
Close #1
End Sub
 
Dernière édition:

dieu08

XLDnaute Occasionnel
Bonjour Roland,

Ton dernier script fonctionne très bien ! Je n'ai néanmoins pas pris le temps de le décortiquer pour le comprendre ! Ce qui me dérange profondément ! :(

Je pense donc prendre le temps de retravailler sur ce script et sur les précédents (plus complexes mais très intéressants).

Je suis en "offline" pendant au moins deux semaines (mon mariage ;)); je reprendrais tout cela à mon retour.

Si tu le permets, je te solliciterai à nouveau...

Merci pour tout le temps passé Roland !
 

dieu08

XLDnaute Occasionnel
Roland,

Pour résumer nos échanges , nous réalisons donc les étapes suivantes :

1. Ouverture du fichier

VB:
Open nomfich1 For Binary As #intFic2 Len = Len(MyInterface)

2. Lecture de la première ligne qui est différente

VB:
If Not EOF(intFic2) Then Line Input #intFic2, strLigne

3. Lecture des lignes suivantes dans une boucle qui stocke les données dans onglet Excel selon une structure définie

VB:
Do While Not EOF(1)
                                         
            ' lecture fichier et repart dans les variables
                                          
                               Get #intFic2, , MyInterface
                                    Cells(NbLigne, 1) = MyInterface.int1
                                    Cells(NbLigne, 2) = MyInterface.int2
                                    Cells(NbLigne, 3) = MyInterface.int3
                                    Cells(NbLigne, 4) = MyInterface.int4
                                    Cells(NbLigne, 5) = MyInterface.int5
                                    Cells(NbLigne, 6) = MyInterface.int6
                                    Cells(NbLigne, 7) = MyInterface.int7
                                    Cells(NbLigne, 8) = MyInterface.int8
                                    Cells(NbLigne, 9) = MyInterface.int9
                                    Cells(NbLigne, 10) = MyInterface.int10
                                    Cells(NbLigne, 11) = MyInterface.int11
                                    Cells(NbLigne, 12) = MyInterface.int12
                                    Cells(NbLigne, 13) = MyInterface.int13
                                    Cells(NbLigne, 14) = MyInterface.int14
                                    Cells(NbLigne, 15) = MyInterface.int15
                                    Cells(NbLigne, 16) = MyInterface.int16
                                    Cells(NbLigne, 17) = MyInterface.int17
                                    Cells(NbLigne, 18) = MyInterface.int18
                                    Cells(NbLigne, 19) = MyInterface.int19
                                    Cells(NbLigne, 20) = MyInterface.int20
                                    Cells(NbLigne, 21) = MyInterface.int21
                                    Cells(NbLigne, 22) = MyInterface.int22
                                    Cells(NbLigne, 23) = MyInterface.int23
                                    Cells(NbLigne, 24) = MyInterface.int24
                                    Cells(NbLigne, 25) = MyInterface.int25
                                    Cells(NbLigne, 26) = MyInterface.int26
                                    Cells(NbLigne, 27) = MyInterface.int27
                                    Cells(NbLigne, 28) = MyInterface.int28
                                    Cells(NbLigne, 29) = MyInterface.int29
                                    Cells(NbLigne, 30) = MyInterface.int30
                                    Cells(NbLigne, 31) = MyInterface.int31
                                    Cells(NbLigne, 32) = MyInterface.int32
                                    Cells(NbLigne, 33) = MyInterface.int33
                                    Cells(NbLigne, 34) = MyInterface.int34
                                    Cells(NbLigne, 35) = MyInterface.int35
                                    Cells(NbLigne, 36) = MyInterface.int36
                                    Cells(NbLigne, 37) = MyInterface.int37
                                    Cells(NbLigne, 38) = MyInterface.int38
                                    Cells(NbLigne, 39) = MyInterface.int39
                                    Cells(NbLigne, 40) = MyInterface.int40
                                    Cells(NbLigne, 41) = MyInterface.int41
                                    Cells(NbLigne, 42) = MyInterface.int42
                                    Cells(NbLigne, 43) = MyInterface.int43
                                    Cells(NbLigne, 44) = MyInterface.int44
                                    Cells(NbLigne, 45) = MyInterface.int45
                                    Cells(NbLigne, 46) = MyInterface.int46
                                    Cells(NbLigne, 47) = MyInterface.int47
                                    Cells(NbLigne, 48) = MyInterface.int48
                                    Cells(NbLigne, 49) = MyInterface.int49
                                    Cells(NbLigne, 50) = MyInterface.int50
                                    Cells(NbLigne, 51) = MyInterface.int51
                                    Cells(NbLigne, 52) = MyInterface.int52
                                    Cells(NbLigne, 53) = MyInterface.int53
                                    Cells(NbLigne, 54) = MyInterface.int54
                                    Cells(NbLigne, 55) = MyInterface.int55
                                    Cells(NbLigne, 56) = MyInterface.int56
                                    Cells(NbLigne, 57) = MyInterface.int57
                                    Cells(NbLigne, 58) = MyInterface.int58
                                    Cells(NbLigne, 59) = MyInterface.int59
                                    Cells(NbLigne, 60) = MyInterface.int60
                                    Cells(NbLigne, 61) = MyInterface.int61
                                                               
            NbLigne = NbLigne + 1
                                   
            Loop

4. Fermeture fichier

VB:
Close #intFic2

Je constate que la première ligne est traitée selon la structure "MyInterface"; c'est à dire que le données se répartissent dans les différentes colonnes de mon onglet.

Mais les données de la seconde ligne lue ne se répartissent pas à partir de la première colonne de la seconde ligne mais à partir de la colonne où la dernière donnée de la première ligne a été posée.

Je n'en comprends pas la raison. Un histoire de retour chariot ? Je ne pense pas que ce soit aussi simple...

Je te remercie d'avance pour tes réponses Roland.

Dieu08.
 

Roland_M

XLDnaute Barbatruc
Bonsoir,

ton code montre que tu n'as rien retenu de ce que je t'ai donné comme exemple !
car tu as déjà tout oublié, ce ne sont pas des fichiers séquentiel avec retour ligne !
ton truc ne fonctionnera pas ainsi !

tu n'as pas tenu compte des modèles de code que je t'ai fourni !?
surtout les les deux dernières macros que j'ai mis ici !
https://www.excel-downloads.com/threads/vb-lecture-ecriture-fichier-txt-choix-ligne.20018936/

le problème est que j'avais gardé toute la structure des fichiers pour essai et qu'avec le temps qui passait j'ai tout effacé pas plus tard qu'hier ! c'est vraiment trop ballot !

je vais essayer de recréer tout ça mais c'est sans trop de conviction car j'ai travaillé pour rien !
 
Dernière édition:

dieu08

XLDnaute Occasionnel
Roland,

J'ai bien en ma possession les scripts que tu m'avais fourni !

Peux-tu m'éclairer sur la signification de "VarX$: Position = Len(VarX$)" :

VB:
Then Line Input #NoFich, VarX$: Position = Len(VarX$) + 3 'suite et retour ligne

Le "VarX$" est une variable globale, pas de soucis mais je ne saisis pas l'ajout des ":" qui suivent...

Merci de ta compréhension :oops:

Dieu08.
 

dieu08

XLDnaute Occasionnel
Bonjour Roland,

Après reprise de tes éléments, je te propose ceci pour avis :

VB:
Sub LectureTestHorsIDB()

Dim T() As String
Dim i As Integer: i = 0
Dim NbLig As Integer: NbLig = 1
Dim TailleFic As Long
Dim MyInterface As interfaceDET
Dim MyInterface2 As interfaceENT

'Lecture

    LenInterface = Len(MyInterface)
  
    Open "\\srvcg08B\applicatifs$\Perceval\INTG_GA\bon\_uvds\sources\infodb_origine.dat" For Binary As #1 Len = Len(MyInterface)
  
    TailleFich = LOF(1) / LenInterface
  
    MsgBox TailleFich
  
    If NbLig = 1 Then If Not EOF(1) Then Line Input #1, VarX$
  
    Position = Len(VarX$) + 3
  
    While Not EOF(1)
  
        i = i + 1
        Get #1, Position, MyInterface
        ReDim T(i, 44)
                    T(i, 1) = MyInterface.int01
                    T(i, 2) = MyInterface.int02
                    T(i, 3) = MyInterface.int03
                    T(i, 4) = MyInterface.int04
                    T(i, 5) = MyInterface.int05
                    T(i, 6) = MyInterface.int06
                    T(i, 7) = MyInterface.int07
                    T(i, 8) = MyInterface.int08
                    T(i, 9) = MyInterface.int09
                    T(i, 10) = MyInterface.int10
                    T(i, 11) = MyInterface.int11
                    T(i, 12) = MyInterface.int12
                    T(i, 13) = MyInterface.int13
                    T(i, 14) = MyInterface.int14
                    T(i, 15) = MyInterface.int15
                    T(i, 16) = MyInterface.int16
                    T(i, 17) = MyInterface.int17
                    T(i, 18) = MyInterface.int18
                    T(i, 19) = MyInterface.int19
                    T(i, 20) = MyInterface.int20
                    T(i, 21) = MyInterface.int21
                    T(i, 22) = MyInterface.int22
                    T(i, 23) = MyInterface.int23
                    T(i, 24) = MyInterface.int24
                    T(i, 25) = MyInterface.int25
                    T(i, 26) = MyInterface.int26
                    T(i, 27) = MyInterface.int27
                    T(i, 28) = MyInterface.int28
                    T(i, 29) = MyInterface.int29
                    T(i, 30) = MyInterface.int30
                    T(i, 31) = MyInterface.int31
                    T(i, 32) = MyInterface.int32
                    T(i, 33) = MyInterface.int33
                    T(i, 34) = MyInterface.int34
                    T(i, 35) = MyInterface.int35
                    T(i, 36) = MyInterface.int36
                    T(i, 37) = MyInterface.int37
                    T(i, 38) = MyInterface.int38
                    T(i, 39) = MyInterface.int39
                    T(i, 40) = MyInterface.int40
                    T(i, 41) = MyInterface.int41
                    T(i, 42) = MyInterface.int42
                    T(i, 43) = MyInterface.int43
                    
        Position = Position + LenInterface + 2 '2=retour ligne
      
        NbLig = NbLig + 1
      
    Wend
                 
    Close #1
  
'Ecriture

    NoFich = FreeFile()
  
    'taille fichier avant ecriture
  
    intNumAv = FileLen("\\srvcg08B\applicatifs$\Perceval\INTG_GA\bon\_uvds\cibles\infodb_test.dat")
  
    MsgBox intNumAv
  
    For NoFich = 1 To TailleFich
  
        Open "\\srvcg08B\applicatifs$\Perceval\INTG_GA\bon\_uvds\cibles\infodb_test.dat" For Random As NoFich Len = Len(MyInterface) 'For Output As #2
          
            With MyInterface
                .int02 = T(i, 2)
                .int03 = T(i, 3)
                .int04 = T(i, 4)
                .int05 = T(i, 5)
                .int06 = T(i, 6)
                .int07 = T(i, 7)
                .int08 = T(i, 8)
                .int09 = T(i, 9)
            End With
        
        'taille fichier apres ecriture
      
        intNumAp = LOF(NoFich) / Len(MyInterface)
      
        MsgBox intNumAp
      
        Put NoFich, intNumAp + 1, MyInterface
           
        Close NoFich
      
    Next NoFich
      
End Sub

Ce dernier script est tout à fait fonctionnel.

J'attends ton avis avant de poursuivre ! Merci !

Dieu08 - en apprentissage !
 

Statistiques des forums

Discussions
312 161
Messages
2 085 844
Membres
103 004
dernier inscrit
ponas