[Déplacé VB6 --> VBA] Travailler avec un fichier *.txt sans ouvrir Excel - vba e

Résolu
jeanjeuv Messages postés 8 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 3 juin 2010 - 8 févr. 2010 à 12:15
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 9 févr. 2010 à 10:55
Bonjour,
Mon objectif est de prélever des plages de données pertinentes d'un fichier *.txt et les copier dans d'autres fichiers *.txt.
Par exemple pour le fichier "test.txt" suivants:

test.txt:
DEBUT EXEMPLE FICHIER TXT
tr ghj
fgdf fg
Code 145

Record 23-10-xxxx
Creation date 23/10/xxxx


Count 7221

Time,ms Force g,N Force d,N
Calibr

0 292.5 306.5
8 301.5 317.5
17 302.5 317.5
25 303.0 318.5 PLAGE 1
33 304.0 319.5
42 305.0 319.5
50 304.5 321.5
58 309.0 323.5
67 308.0 322.5
75 309.0 321.0
83 311.5 322.5
92 315.5 329.5
100 316.5 329.5
108 318.5 329.5
117 319.0 330.0
140 0 0
168 0 0

75 309.0 321.0
0 311.5 322.5
17 315.5 329.5
45 316.5 329.5 PLAGE 2
70 318.5 329.5
90 0 0
110 0 0
/color
...et ainsi de suite
FIN EXEMPLE FICHIER TXT

Je souhaite pouvoir stocker mes différentes plages (plage 1 -bleu, plage 2- violet..) dans différents fichiers *.txt (plage1.txt, plage2.txt ..) sans ouvrir un classeur excel. De plus en copiant ces plages de données je souhaite aussi rajouter une colonnes de données dans ces fichiers textes (plage1,2..) qui sera la somme de la colonne 2 et 3.
La fin de chaque plage de données est identifiée par des zéros dans la colonne 2 et 3.
J'ai déjà effectué avec succès ce programme en transférant mes données sous un classeur excel mais cela prend trop de temps, en effet un seul fichiers de données txt fait 40 Mo, sachant que j'aimerais traiter une centaine de fichier.... J'ai déjà essayé avec 2 fichiers, cela prend 1 minute pour les traiter et j'ai une grosse bécane, j'aimerais bien accélérer le processus, d'ou l'idée de ne pas passer par excel pour extraire mes plages de données car c'est ce transfert(txt vers xls) qui prend du temps.
Pour en revenir à mon problème, je dirais que ma première difficulté est de pouvoir lire les données que je veux dans mon fichier texte (facile sous excel mais beaucoup moins dans un fichier txt), par exemple pour identifier mes plages de données, je dois pouvoir détecter mes rangées de "0" dans les colonnes 2 et 3; des méthodes de manipulation de fichier txt autorise la lecture d'une ligne ou d'un caractére (Read x, readline...) mais pour lire la donnée située à la ligne x colonne y je vois pas comment faire...
En espérant avoir été clair!
Si vous pouviez m'aider.

Merci

6 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 févr. 2010 à 12:58
Salut
Euh ... Il n'y a aucun rapport entre un fichier texte et Excel.
Tu dis être sous VB6 (catégorie) : pourquoi parles-tu de Excel ?

Dans ton fichier texte, tu parles de "plage" : Définition ?

Pour lire la 50ème ligne d'un fichier texte, il te faudra d'abord lire les 49 premières, pas le choix.
L'accès direct n'est possible que dans les fichiers à accès séquentiel où chaque 'ligne' est formattée et a une longueur fixe.

Voir les exemples parmi les codes que tu trouveras en recherchant "lire fichier"
Voir instructions Open, Line Input #, Close #, Do-While
Voir instruction Split si tu dois décomposer une ligne en un tableau d'éléments (sépararation espace, par exemple).

"mais pour lire la donnée située à la ligne x colonne y" Dans un fichier texte, il n'y a pas de colonne

Peut-être as-tu besoin d'optimiser ton code, mais on ne sait pas à quoi il ressemble.
Avec les vitesses des disques durs et la taille phénoménale de leurs buffers, les accès sont pourtant hyper rapides. Bizarre que cela prenne autant de temps.
Pour mémo, si dans ton traitement ligne à ligne, tu affiches les données à l'écran, cela peut prendre 30% à 60% de temps en plus.

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)
3
jeanjeuv Messages postés 8 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 3 juin 2010
8 févr. 2010 à 15:33
Bonjour,
Ci-dessous mon code en transférant les données issus d'un fichier txt vers une feuille excel pour traitement puis copie du résultat (les plages de données pertinentes) vers des fichiers txt (plage1, 2 txt). Pour 2 fichiers de 40Mo à traiter, compter 40s d'exécution de programme, je me demandais si il était possible d'accélérer le programme..
J'ai essayé d'utiliser un tableau (méthode line Input #f contenuLigne et méthode split: Tableau Split(ContenuLigne, Separateur)) mais cela prend encore plus de temps. Si vous avez des idées pour accélérer ce code...Merci



Private Sub opentxt_to_xls(ByVal rep As String, ByVal fich As String, MaFeuille As Variant)

Dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")

If Right(rep, 1) <> "" Then rep = rep & "" 'Ajoute \ à la fin s'il y en a pas
If FSO.FileExists(rep & fich) Then 'Existence du fichier
MaFeuille.Visible = False 'Application Excel invisible
' Ouvre un fichier texte sous forme de classeur Excel avec Largeur fixe et délimiteur Tabulation
MaFeuille.Workbooks.OpenText rep & fich, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, _
Comma:=False, Space:=False, Other:=False
End If
End Sub

'********************************************************
' Procédure principale
'********************************************************

Sub troncature()


Dim ligne As Long
Dim repere1 As Long
Dim repere2 As Long
Dim repere3 As Long
Dim repere4 As Long
Dim summ As Single
Dim f As Integer
Dim FileName As String
Dim k As Integer
Dim i As Integer
Dim j As Integer
Dim C As Variant
Dim A As Integer, B As Integer
Dim tmP As String
Dim Separateur As String
Dime Nbfichier_source As Integer
Dim MaFeuille: Set MaFeuille = CreateObject("Excel.Application") 'ouverture d'une application Excel
j = 1

' Répertoire source
'************************************************
rep = "C:\documents\source"
'*************************************************

Do While j <> nbfichier_source ' Tant que tout les fichiers sources n'ont pas été traités
ligne = 0
i = 0 ' Initialisation
k = 1
fich = "source" & CStr(j) & ".txt" ' Fichier source

Call opentxt_to_xls(rep, fich, MaFeuille) 'transfert du fichier texte vers fichier xls

'Choix du séparateur
Separateur = vbTab
'***************************************
' Identification ligne début 1ere plage
'***************************************
Do
ligne = ligne + 1
Loop Until MaFeuille.Cells(ligne, 1) = "repere"
ligne = ligne + 2 'On se positionne sur la ligne de donnees brutes
repere1 = ligne 'Repere n°1: début de la 1ere plage

'***************************************
' Identification ligne fin 1ere plage
'***************************************
Do Until MaFeuille.Cells(ligne, 2) 0 And MaFeuille.Cells(ligne, 3) 0
ligne = ligne + 1
Loop
repere2 = ligne + 10 'Repere n°2: fin de la première plage

'**************************************************************************
' Enregistrement plage 1 (n lignes, 4 colonnes) dans "plage j\plage j1.txt"
'**************************************************************************
MkDir "C:\documents\plage" & CStr(j) & "" 'Création d'un répertoire "plage j"
FileName = "C:\documents\plage" & CStr(j) & "\plage" & CStr(j) & CStr(k) & ".txt"
k = 2
' Obtention d'un numéro de fichier libre
f = FreeFile

' Ouverture en mode écriture ("output")
Open FileName For Output As #f

' Délimitation de la 1ere plage

C = MaFeuille.Range("A" & repere1, "D" & repere2)


For A = 1 To UBound(C, 1) ' Parcour des lignes de la 1ere plage
tmP = ""
For B = 1 To UBound(C, 2) ' Parcour les colonnes de la ligne
If tmP > "" Then
If B = 4 Then
summ = CSng(C(A, B - 2)) + CSng(C(A, B - 1))
tmP = tmP & Separateur & summ
Else
tmP = tmP & Separateur & C(A, B)
End If
Else
tmP = C(A, B)
End If
Next
Print #f, tmP
Next
Close #f
Erase C

'*********************************************
' Identification de la ligne début nieme plage
'*********************************************

Do Until MaFeuille.Cells(ligne, 1) = "reperefin"
Do While MaFeuille.Cells(ligne, 2) 0 And MaFeuille.Cells(ligne, 3) 0
If MaFeuille.Cells(ligne, 1) = "reperefin" Then
i = 1
Exit Do
Else: ligne = ligne + 1
End If
Loop
If i = 0 Then
repere3 = ligne
End If
'*******************************************
' Identification de la ligne fin nieme plage
'*******************************************
Do While MaFeuille.Cells(ligne, 2) <> 0 Or MaFeuille.Cells(ligne, 3) <> 0
ligne = ligne + 1
Loop
If i = 0 Then
repere4 = ligne + 10
'*******************************************************
' Enregistrement nieme plage dans "plage j\plage jn.txt"
'*******************************************************
FileName = "C:\documents\plage" & CStr(j) & "\plage" & CStr(j) & CStr(k) & ".txt"

' Obtention d'un numéro de fichier libre
f = FreeFile

' Ouverture en mode écriture ("output")
Open FileName For Output As #f

' Délimitation de la nieme plage
C = MaFeuille.Range("A" & repere3, "D" & repere4)


For A = 1 To UBound(C, 1) ' Parcour des lignes de la nieme plage
tmP = ""
For B = 1 To UBound(C, 2) ' Parcour les colonnes de la ligne
If tmP > "" Then
If B = 4 Then
summ = CSng(C(A, B - 2)) + CSng(C(A, B - 1))
tmP = tmP & Separateur & summ
Else
tmP = tmP & Separateur & C(A, B)
End If
Else
tmP = C(A, B)
End If
Next
Print #f, tmP
Next
Close #f
Erase C
repere2 = 0
repere3 = 0
k = k + 1
End If
Loop

j = j + 1
Loop
MaFeuille.Application.Quit 'Fermeture du classeur Excel ouvert
MsgBox "Troncature Terminée"

End Sub
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
8 févr. 2010 à 16:41
Bonjour,
1) tu définis mafeuille (ton Dim MaFeuille: Set MaFeuille = CreateObject("Excel.Application")) comme un objet Excel
uis :
2) tu ouvres un ficher texte (on sez demande pourquoi) par FSO (si c'est pour en vérifier l'existence, un bête et simple Dir aurait suffi !)
et là :
3) tu sembles vouloir importer sous excel ton fichier Texte (s'asserz curieuse manière, d'ailleurs, puisque tu ne définis aucun classeur, ni, donc aucune feuille en son sein)
pour enfin :
4) traiter l'importation, pour écrire dans un fichier texte, apparemment, une donnée tmp.

Et tu t'étonnes de la lourdeur et de la lenteur générées.
Peux-tu nous dire exactement ce que tu cherches à ainsi faire ? Il doit y avoir plus simple, assurément ?
Et nous préciser dans la foulée la structure de ton premier fichier texte (celui importé) , au besoin en nous en montrant un petit morceau ?
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 févr. 2010 à 19:35
Ah, tu es donc sous Excel (VBA) et pas sous VB6

Quand tu écris ton fichier, tu utilises la commande Open en mode Output.
Pourquoi n'ouvrirais-tu pas ton fichier source avec la même instruction Open en mode Input cette fois + instruction boucle Do-While + Line Input #), c'est à dire le b.a.ba. que tu trouves dans n'importe quelle source qui traite la lecture de fichier texte ?

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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jeanjeuv Messages postés 8 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 3 juin 2010
9 févr. 2010 à 09:10
Bonjour,
Oui désolé effectivement je n'avais pas vu la rubrique vba et je pensais que vb6 correspondait.
Pour en revenir à mon pb, je ne vois pas comment faire dans les fichiers txt tout ce que je fais grâce aux méthodes range et cells sous les classeurs (cf. mon programme ci-dessus), mais je vais y réfléchir, faire d'autres essais...
Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
9 févr. 2010 à 10:55
Montre-nous :
1) par copier-coller depuis bloc-notes : un morceau (au moins 2 plages) de ton fichier texte )à traiter
2) le fichier texte à écrire sur la base du morceau en question
Il y a probablement moyen d'éviter de se servir d'Excel.

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
Rejoignez-nous