Traitement fichier Txt en VBA

[Résolu]
Signaler
Messages postés
10
Date d'inscription
jeudi 5 juillet 2012
Statut
Membre
Dernière intervention
6 juillet 2012
-
Messages postés
10
Date d'inscription
jeudi 5 juillet 2012
Statut
Membre
Dernière intervention
6 juillet 2012
-
Bonjour tout le monde,

j'aimerais créer une moulinette en VBA en important un fichier txt qui doit avoir plus de 10 000 caractères. le fichier txt comporte des chiffres et des points (les espaces).
ex:9.....-12...12....490...1.....-11...1.....501...-4....-2....10....494...

je voudrais que tout les 24 caractères il y ai un retour chariot pour passer à la cellule de la ligne suivante, et que chaque chiffre soit mis dans une cellule:
9.....-12...12....490...
1.....-11...1.....501...
-4....-2....10....494...


Je nz sais pas si c'est très compréhensible mais j'espère avoir une réponse
P.S.: je ne veux pas a avoir à modifier le txt en plus.

Merci beaucoup d'avance :)

25 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
J'ai fait une erreur (la première donnée non prise en compte !) ===>> corrige ainsi ===>>
toto = "9     -12   12    490   1     -11   1     501   -4   -2    10   494   1     -11   1     501   -4   -2    10   494      1     -11   1     501   -4   -2    10   494      "
  Do While InStr(toto, "  ")
    toto = Replace(toto, "  ", " ")
  Loop
  titi = Split(toto, " ")
  ou = 1
  For i = 0 To UBound(titi) - 4 Step 4
    Cells(ou, 1) = titi(i)
    For j = 1 To 3
      Cells(ou, j + 1) = titi(i + j)
    Next
    ou = ou + 1
  Next

J'ai vérifié : Marche .
Je te rappelle que toto est le contenu de tout ton fichier.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
bonjour,

je déplace vers VBA..


cantador
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour,
La "description" que tu fais de ton fichier ne permet pas de te répondre avec assurance.
Deux questions qui ont leur importance :
1) les données de ce fichiers sont-elles sur une seule ligne (sans vbcrlf, donc) ?
2) si oui : il y a tout lieu de penser qu'il s'agit d'un fichier structuré. Quelle en est la structure, donc ?
3) si non : que faire des vbcrlf déjà présents ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
10
Date d'inscription
jeudi 5 juillet 2012
Statut
Membre
Dernière intervention
6 juillet 2012

1) à la base, tout est sur une seule ligne
J'aimerais donc créer des lignes comprenant à chaque fois 24 caractères( 6 caractères par information par cellule)
2) j'ai l'impression que chaque information est structuré sur 6 bits (chiffre et espace)
j'aimerais avoir 4 information par ligne

9.....-12...12....490...
1.....-11...1.....501...
-4....-2....10....494...

J'espère que vous me comprenez
P.S: je peux déposer le fichier brut si cela vous aide ?

Merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
j'ai l'impression que chaque information est structuré sur 6 bits (chiffre et espace)

Et moi, j'en ai bien plus que l' "impression"
Raison pour laquelle ma question, que je répète :
2) si oui : il y a tout lieu de penser qu'il s'agit d'un fichier structuré. Quelle en est la structure, donc ?

On ne peut "travailler" sur une "impression".
Il est vraisemblable que tu as là affaire à un fichier à accès séquentiel direct, utilisé comme base de données. Il aura alors été écrit sur la base d'une structure ! Quelle est-elle donc ?
Une structure de fichier revêt cet aspect (exemple)
Private type la_strucure_en_cause
  toto as string * 20
  titi as long
  tata as string * 3
  '... etc ...
end type

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Un moyen simple : interroge celui qui t'envoie ce fichier à traiter.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
10
Date d'inscription
jeudi 5 juillet 2012
Statut
Membre
Dernière intervention
6 juillet 2012

je voudrais bien demander à la personne qui m'a envoyé le fichier, mais elle n'est pas au courante et c'est à moi donc de faire la recherche :)

en fait les données sont collectées par un accéléromètre qui calcule une accélération en X, en Y et Z et le son (d'ou les 4 informations par ligne)
lorsque le collecteur de données est branché par usb sur un pc, il crée un fichier. Et c'est ce fichier que j'essaye de traiter.


voici a quoi ressemble mon fichier brut : http://www.packupload.com/31WUY1LH6OQ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Ecoute,
je n'aime en général pas que l'on traite les effets au lieu des causes.
Et la cause, dans cette affaire, c'est l'écriture même du fichier !
"saloper" pour "saloper" (et en admettant que ce que tu "vois" est exact) regarde ce que fait ceci :
toto = "9     -12   12    490   1     -11   1     501   -4   -2    10   494   "
  For i = 5 To 1 Step -1
    toto = Replace(toto, String(i, " "), vbCrLf)
  Next
  MsgBox toto

Voilà : tu les as tous ainsi distincts. A toi de les organiser comme tu l'entends à partir de là (je ne veux même pas en entendre parler )

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut

Oui, relire ce fichier nécessiterait de connaitre la structure exacte des données; 24 caractères par ligne étant un peu vague et pas très technique.

Pour transformer le fichier où toutes les données se suivent par un fichier où les données sont tronçonnées en paquet de 24 caractères séparés par des retour chariot, je te propose d'utiliser la lecture séquentielle :
    Dim ff1     As Integer
    Dim ff2     As Integer
    Dim sBuffer As String * 24  ' 24 caractères à lire
    
    ' Ouverture du fichier à lire
    ff1 = FreeFile
    Open "Fichier original.txt" For Binary Access Read As #ff1
    ' Ouverture du fichier à écrire
    ff2 = FreeFile
    Open "Fichier modifié.txt" For Output As #ff2
    Do While Not EOF(ff1)
        Get #ff1, , sBuffer
        Print #ff2, sBuffer & vbCrLf
        DoEvents
    Loop
    Close #ff2
    Close #ff1

Si tu dois modifier le contenu du buffer avant de l'écrire, tu dois pouvoir isoler chaque chiffre à l'intérieur du buffer grace à un Split (voir l'aide)

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

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour, jack,
J'irais même plus loin.
Je suppose qu'il veut pouvoir exploiter des données.
Je vois bien que chacun de ses "groupes" de 4 "valeurs" sur 6 caractères devraient en fait représenter 4 éléments à utiliser séparément. Et surtout pas d'espaces !
Pour que la chose soit utile et technique, il lui faudrait écrire un nouveau fichier séquentiel à accès direct, construit sur cette structure :
Private type la_structure
  element1 as integer
  element2 as integer
  element3 as integer
  element4 as integer
end type


La lecture de chaque enregistrement serait alors simple !
Pour chaque enregistrement (typer enregistrement as la_structure): lire :
enregistrement.element1
enregistrement element2
enregistrement element3
enregistrement.element4

Voilà ce que je pense. Et c'est la raison de mon expression :

L'écriture et la lecture d'un tel fichier se fait en l'ouvrant "For Random", s'écrit avec Put et se lit avec Get)

Voilà ce que j'en pense et qui explique mon :
[quote]Voilà : tu les as tous ainsi distincts. A toi de les organiser comme tu l'entends à partir de là (je ne veux même pas en entendre parler )

Qui fait allusion à une "démarche" (la sienne) qui serait tout sauf efficace.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Illustration de ce que j'explique.
Exemple :
Private Type mon_type
    un_nombre As Integer
    une_chaine As String * 30
End Type

Private Sub Command1_Click()
Dim enregistrement As mon_type, unnumero
Open "c:\essai.txt" For Random As #1 Len = Len(enregistrement)
    For unnumero = 1 To 5
      enregistrement.un_nombre = unnumero * 2
      enregistrement.une_chaine = "chaine" & unnumero
      Put #1, unnumero, enregistrement
   Next unnumero
Close #1
End Sub

Private Sub Command2_Click()
Dim enregistrement As mon_type, unnumero
Open "c:\essai.txt" For Random As #1 Len = Len(enregistrement)
    For maposition = 1 To 5
      Get #1, maposition, enregistrement
      MsgBox "enregistrement n° " & maposition & vbCrLf & _
      "un_nombre " & enregistrement.un_nombre & vbCrLf & "une_chaine " & enregistrement.une_chaine
    Next maposition
Close #1
End Sub

Command1 pour écrire des enregistrements
Command2 pour les lire





________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
10
Date d'inscription
jeudi 5 juillet 2012
Statut
Membre
Dernière intervention
6 juillet 2012

Un tout grand merci pour vos réponses.
Je sais que je ne suis pas très clair et donne peut-être pas assez d'informations mais je suis un amateur et c'est pour cela que je viens vous demander de l'aide.
je vais voir avec ce que vous me suggérez ce que je pourrais en faire.

pour récap (peut-etre plus clair), à la base quand j'insère le fichier brut dans excel toutes les données se mettent dans une seule cellule. alors je me suis dit que par vba, il doit surement y avoir un moyen de séparer tout les chiffres individuellement dans une cellule et de créer une structure grâce à un retour chariot. (ici : 4 chiffres par ligne)
http://imageshack.us/photo/my-images/96/capturedcran20120706112.png/
Le must évidemment ca serait de pouvoir importer n'importe quel autre fichier de la même structure (pas spécialement de la même longueur) dans excel grâce à un bouton qui ouvre une boite de dialogue demandant quel fichier je veux importer et par la suite l'importe en le traitant.

Encore un grand merci pour votre aide
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Ce ne sera pas un retour-charriot, qu'il te faudra, mais une véritable structure.
Relis mon exemple.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
10
Date d'inscription
jeudi 5 juillet 2012
Statut
Membre
Dernière intervention
6 juillet 2012

ok, merci. je vais me concentrer sur ta proposition!
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
"il doit surement y avoir un moyen de séparer tout les chiffres individuellement dans une cellule"
Oui, après la lecture des 24 octets/caractères, il te suffit d'utiliser Split (comme déjà suggéré)

"de créer une structure grâce à un retour chariot"
Cela aurait un sens si tu devais recréer un nouveau fichier = l'exemple de code que je t'ai fourni.
Si tu dois lire les données et les placer dans une feuille, la meilleure méthode est de lire tes paquets de 24 octets et d'utiliser Split pour isoler chaque chiffre, puis de les rentrer dans tes cellules par un jeu de boucle For-Next

"importer n'importe quel autre fichier de la même structure (pas spécialement de la même longueur)"
Hélas, dans ton fichier, rien dans l'entête ne laisse supposer que les données sont par paquet de 24 octets.

L'entête :
Il semble se présenter par sous-paquets de 6 octets :
- L'année suivie d'un tiret (6 premiers octets)
- Le mois et le jour séparés par un tiret (6 octets suivants)
- Un chiffre, 1113 (et 2 espaces pour compléter les 6 octets)
- Un chiffre, 8211 (et 2 espaces pour compléter les 6 octets)
- Un chiffre, 0 (et 5 espaces pour compléter les 6 octets)
- Un chiffre, 258 (et 3 espaces pour compléter les 6 octets)
- L'octet "0" qui sert souvent de séparateur dans les fichiers structurés
- 6 paquets de 6 octets contenant des espaces
- Les paquets suivants étant composés des séries de 4 paquets de 6 octets avec tes données.
C'est hélas tout se qu'on peut en tirer comme conclusion.

Est-ce que 1113 ou 8211 ne seraient pas le nombre d'enregistrements de ton fichier ?
D'après un rapide calcul, tes premières données commencent à l'emplacement 73 et se terminent en 213.457, soit 213.384 octets, soit 8.891 séries de données (4x6) - rien qui rappelle les premiers chiffres.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Ouais...
Une solution bâtarde et peu propre existe (quel que soit le nombre des espaces) . La voilà :
toto = "9     -12   12    490   1     -11   1     501   -4   -2    10   494   "
  Do While InStr(toto, "  ")
    toto = Replace(toto, "  ", " ")
  Loop
  titi = Split(toto, " ")
  ou = 1
  For i = 0 To UBound(titi) - 4 Step 4
    For j = 1 To 4
      Cells(ou, j) = titi(i + j)
    Next
    ou = ou + 1
  Next

ou toto est le contenu de tout ton fichier reçu

Je n'aime pas du tout cette manière peu orthodoxe de faire

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
10
Date d'inscription
jeudi 5 juillet 2012
Statut
Membre
Dernière intervention
6 juillet 2012

oui, les données commencent toujours au 73 emplacement/octet. les chiffres 1113 ou 8211 sont des données entrées par l'utilisateur, c'est un numéro de référence.
Messages postés
10
Date d'inscription
jeudi 5 juillet 2012
Statut
Membre
Dernière intervention
6 juillet 2012

"Hélas, dans ton fichier, rien dans l'entête ne laisse supposer que les données sont par paquet de 24 octets".

En fait, l'image représente la manière dont je voudrais que les données s'insère dans Excel.
Donc créer une macro avec une moulinette qui analyse les 6 premiers octets du fichier et les mettent dans la première cellule de la première ligne puis les 6 autres suivant dans la deuxième cellule à la même ligne, et après la 4ème cellule d'excel comportant l'octet 18 à 24, il sache qu'il doit mettre les octets 25 à 30 dans la première cellule de la deuxième ligne, et continue ainsi de suite.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Regarde ce que fait mon dernier bout de code (y compris si le nombre d'espaces entre les données n'est jamais le même)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
10
Date d'inscription
jeudi 5 juillet 2012
Statut
Membre
Dernière intervention
6 juillet 2012

merci! je pense qu'avec ca, ca devrait faire l'affaire :)j'ai testé ca marche.je vais maintenant introduire dans le code, une boite de dialogue demandant quel fichier je choisis, et aisni dire que c'est toto.