viclaudel
Messages postés13Date d'inscriptiondimanche 15 mars 2009StatutMembreDernière intervention19 mars 2009
-
15 mars 2009 à 21:23
viclaudel
Messages postés13Date d'inscriptiondimanche 15 mars 2009StatutMembreDernière intervention19 mars 2009
-
18 mars 2009 à 23:39
Bonjour, je suis débutant en VB, je dois traiter des fichiers rapport d'exploitation en fichier text.
Il faut grace un programme en VB6 que j'aille ouvrir, lire, extraire des valeurs, et les réécrire dans un nouveau fichier text sous forme de colonne.
Le fichier text que je dois lire contient à un moment une valeur je dois extraire les 1000 première valeur et les mettre en colonne dans le nouveau fichier. (des que la ligne commence avec AT je récupère la valeur entre parenthèse)
Je dois le faire 5 fois de suite pour obtenir 5 colonnes avec toutes les valeurs.
J'arrive à faire ma première colonne mais j'utlise le même principe pour les autre et rien ne s'affiche.
Voilà une partie du fichier que je dois lire :
[HEADER]
DATE = date #2009-03-04
STANDARD = 'PLCopen v0.1 1993'
SENDER = 'Schneider Electric Industries SAS PL7 PRO V4.5'
[APPLICATION]
NAME = 'STATION'
DATE = date #2009-02-26
VERSION = '0'
[DATA_UNIT]DA_TYPE LOCATION NAME BODY VAR_GLOBAL
AT %MW1000 : WORD := (384);
AT %MW1001 : WORD := (384);
AT %MW1002 : WORD := (384);
AT %MW1003 : WORD := (384);
AT %MW1004 : WORD := (384);
AT %MW1005 : WORD := (384);
AT %MW1006 : WORD := (384);
AT %MW1007 : WORD := (383);
AT %MW1008 : WORD := (383);
AT %MW1009 : WORD := (383);
AT %MW1010 : WORD := (383);
AT %MW1011 : WORD := (383);
AT %MW1012 : WORD := (383);
AT %MW1013 : WORD := (383);
AT %MW1014 : WORD := (383);
AT %MW1015 : WORD := (383);
AT %MW1016 : WORD := (383);
AT %MW1017 : WORD := (383);
AT %MW1018 : WORD := (383);
AT %MW1019 : WORD := (383);
AT %MW1020 : WORD := (383);
AT %MW1021 : WORD := (383);
AT %MW1022 : WORD := (383);
AT %MW1023 : WORD := (383);
Voilà mon code quand je clique sur un bouton je le fais que pour 2 colonnes pour l'instant :
Private Sub Command1_Click()
Dim FSys, fs, Mypo, Mypo2, NbCar 'pour creation du fichier
Dim MonFich, ReadC 'indication du nom du fichier
Dim Msg 'message de réussite
Dim Name 'nom du nouveau fichier
Dim donnees
Dim i, j As Integer
Dim C, C2 As String
Dim t As Variant
Dim Montableau(0 To 2, 0 To 999) As String
Dim chaine
'on récupére les données inscritent par l'utilisateur
G_CheminFichier = TXT_Chemin_Fichier.Text
G_NomFichier = TXT_Nom_Fichier.Text
G_NomFichierText = TXT_Nom_Fichier_Texte.Text
'Lecture
If G_NomFichier <> "" Then
'ouverture du fichier source
Open G_CheminFichier + G_NomFichier For Input As #1
For i = 0 To 1999
Line Input #1, ReadC
'If Trim(ReadC) <> "" Then
'If Trim(ReadC) <> "" Then
'extraction de la valeur
If Left(ReadC, 2) = "AT" Then
Mypo = InStr(1, ReadC, "(")
Mypo2 = InStr(1, ReadC, ")")
NbCar = Mypo2 - Mypo
C = Mid(ReadC, Mypo + 1, NbCar - 1)
i = i + 1
'mise de la valeur dans un tableau en fonction du numéro de la ligne
If 0 < i <= 999 Then
Montableau(0, 999) = Montableau(0, 999) & vbCrLf & C & ";"
Else
Montableau(1, 999) = Montableau(1, 999) & vbCrLf & C & ";"
End If
End If
'mise de valeur dans un chaine
chaine = CStr(Montableau(0, 999)) & CStr(Montableau(1, 999))
Next i
Close #1
End If
Text1.Text = chaine
'ecriture dans le nouveau fichier
Set FSys = CreateObject("Scripting.FileSystemObject")
Set MonFich = FSys.createtextfile("D:\Name.txt")
With MonFich
.writeline ("Num pts;U Alt; I Alt; % PID; U Exi;I Ext")
.writeline chaine
End With
et voilà ce que j'obtiens dans mon nouveau fichier sans ma 2ème colonne :
pcpunch
Messages postés1243Date d'inscriptionmardi 7 mai 2002StatutMembreDernière intervention18 février 20195 15 mars 2009 à 23:14
Bonsoir j'espére que j'ai bien compris ce que tu recherche, car je suis un peu rouillé, ca fait 4 ans que je n'ai plus touché a la vb, ni a la prog, mais comme j'ai envie de m'y remettre je me suis penché sur ton probléme...
Je suis certain qu'il y a une meilleure maniére de procéder, mais avec mes reste et les quelques minute que j avais, c'est tous ce que j'ai pu faire lol
- J'utilise un 5 tableaux dynamique qui represente les 5 colonnes
- J'extrait les donnés du fichier et je remplie la coloneA de 1 a 1000 ensuite je passe a la coloneB et ainsi de suite...
A la sortie ca marche, mais il faudra que tu voi comment gérer au cas ou il y a pas 5000 données extraite???? sinon nada dans le fichier
voila au cas ou tu a besoin d'un peu plus d'aide hesite pas!!!!!!!!!!!!
voici mon code :
'Declaration des 5 colones ABCDEF
Dim ColA()
Dim ColB()
Dim ColC()
Dim ColD()
Dim ColE()
Dim Nb As Variant 'Stocke Nombre total de chiffre extrait du fichier
Dim Temp As String 'Variable temporaire pour analyse de ligne du fichier
'lecture, stockage,recup dans tableau
Open App.Path & "/source.txt" For Input As #1 'le fichier source
Do While Not EOF(1)
Line Input #1, Temp
'Si la ligne commence par AT alors extraction des chiffre entre ()
If Mid(Temp, 1, 2) = "AT" Then
Dim PosDep As Integer
Dim PosFin As Integer
Dim Nombre As String
PosDep = InStr(1, Temp, "(", vbTextCompare)
PosFin = InStr(PosDep, Temp, ")", vbTextCompare)
Nombre = Mid(Temp, PosDep + 1, PosFin - PosDep - 1)
Nb = Nb + 1
Select Case Nb
Case 1 To 1000
ReDim Preserve ColA(Nb)
ColA(Nb) = Nombre
Case 1001 To 2000
ReDim Preserve ColB(Nb - 1000)
ColB(Nb - 1000) = Nombre
Case 2001 To 3000
ReDim Preserve ColC(Nb - 2000)
ColC(Nb - 2000) = Nombre
Case 3001 To 4000
ReDim Preserve ColD(Nb - 3000)
ColD(Nb - 3000) = Nombre
Case 4001 To 5000
ReDim Preserve ColE(Nb - 4000)
ColE(Nb - 4000) = Nombre
End Select
End If
Loop
Close #1
'ecriture du tableau dans le fichier de sortie
Open App.Path & "/fichier sortie.txt" For Output As #1
For i = 1 To UBound(ColA)
On Error Resume Next 'au cas ou il y a pas 5000 entré d extraite du fichier
Print #1, ColA(i) & vbTab & ColB(i) & vbTab & ColC(i) & vbTab & ColD(i) & vbTab & ColE(i)
Next i
Close #1
End Sub
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 17 mars 2009 à 01:18
salut
j'ai repris le code de "punch", je l'ai finalisé pour aboutir au résultat souhaité, en voila une copie:
Private Sub Command1_Click()
Dim ColA() As String
Dim ColB() As String
Dim ColC() As String
Dim ColD() As String
Dim ColE() As String
ReDim ColA(0)
ReDim ColB(0)
ReDim ColC(0)
ReDim ColD(0)
ReDim ColE(0)
Dim Nb As Variant 'Stocke Nombre total de chiffre extrait du fichier
Dim Temp As String 'Variable temporaire pour analyse de ligne du fichier
'lecture, stockage,recup dans tableau
Open App.Path & "\source.txt" For Input As #1 'le fichier source
Do While Not EOF(1)
Line Input #1, Temp
'Si la ligne commence par AT alors extraction des chiffre entre ()
If Mid(Temp, 1, 2) = "AT" Then
Dim PosDep As Integer
Dim PosFin As Integer
Dim Nombre As String
PosDep = InStr(1, Temp, "(", vbTextCompare)
PosFin = InStr(PosDep, Temp, ")", vbTextCompare)
Nombre = Mid(Temp, PosDep + 1, PosFin - PosDep - 1)
Nb = Nb + 1
Select Case Nb
Case 1 To 1000
ReDim Preserve ColA(Nb)
ColA(Nb) = Nombre
Case 1001 To 2000
ReDim Preserve ColB(Nb - 1000)
ColB(Nb - 1000) = Nombre
Case 2001 To 3000
ReDim Preserve ColC(Nb - 2000)
ColC(Nb - 2000) = Nombre
Case 3001 To 4000
ReDim Preserve ColD(Nb - 3000)
ColD(Nb - 3000) = Nombre
Case 4001 To 5000
ReDim Preserve ColE(Nb - 4000)
ColE(Nb - 4000) = Nombre
End Select
End If
Loop
Close #1
'écriture du tableau dans le fichier de sortie
Open App.Path & "/fichier sortie.txt" For Output As #1
For i = 1 To UBound(ColA)
'On Error Resume Next 'au cas ou il y a pas 5000 entré d extraite du fichier
If UBound(ColB) = 0 Then _
Print #1, ColA(i)
If UBound(ColC) = 0 Then ReDim Preserve ColB(UBound(ColA)): _
Print #1, ColA(i) & ";" & ColB(i)
If UBound(ColD) = 0 Then ReDim Preserve ColC(UBound(ColA)): _
Print #1, ColA(i) & ";" & ColB(i) & ";" & ColC(i)
If UBound(ColE) = 0 Then ReDim Preserve ColD(UBound(ColA)): _
Print #1, ColA(i) & ";" & ColB(i) & ";" & ColC(i) & ";" & ColD(i)
If UBound(ColE) <> 0 Then ReDim Preserve ColE(UBound(ColA)): _
Print #1, ColA(i) & ";" & ColB(i) & ";" & ColC(i) & ";" & ColD(i) & ";" & ColE(i)
Next i
Close #1
End Sub
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 18 mars 2009 à 15:27
En reprenant ton code et en ayant débogué et finalisé celui-ci, voici cette nouvelle version de code.
Private Sub Command1_Click()
Dim FSys, fs, Mypo, Mypo2, NbCar 'pour creation du fichier
Dim MonFich, ReadC 'indication du nom du fichier
Dim Msg 'message de réussite
Dim Name 'nom du nouveau fichier
Dim donnees
Dim i, j As Integer
Dim C, C2 As String
Dim t As Variant
Dim Montableau(0 To 4, 0 To 999) As String
Dim chaine
'on récupére les données inscritent par l'utilisateur
G_CheminFichier = TXT_Chemin_Fichier.Text
G_NomFichier = TXT_Nom_Fichier.Text
G_NomFichierText = TXT_Nom_Fichier_Texte.Text
'Lecture
If G_NomFichier <> "" Then
'ouverture du fichier source
Open G_CheminFichier + G_NomFichier For Input As #1
'****** For i = 0 To 4999 *********
'dans la boucle "FOR", les lignes d'entête sont comptées, ce qui fausse le nombre d'éléments du tableau "Montableau(0, i)", on préfèrera une boucle "DO LOOP"
'boucle sur 5000 lignes
i = 0
Do While i < 5000
' gestion d'erreur si moins de 5000 lignes
On Error Resume Next
Line Input #1, ReadC
If Err.Number <> 0 Then
Err.Clear
Exit Do
End If
'extraction de la valeur
If Left(ReadC, 2) = "AT" Then
Mypo = InStr(1, ReadC, "(")
Mypo2 = InStr(1, ReadC, ")")
NbCar = Mypo2 - Mypo
C = Mid(ReadC, Mypo + 1, NbCar - 1)
'mise de la valeur dans un tableau en fonction du numéro de la ligne
If i <= 999 Then
Montableau(0, i) = C
ElseIf i <= 1999 Then
Montableau(1, i - 1000) = C
ElseIf i <= 2999 Then
Montableau(2, i - 2000) = C
ElseIf i <= 3999 Then
Montableau(3, i - 3000) = C
ElseIf i <= 4999 Then
Montableau(4, i - 4000) = C
End If
i = i + 1
End If
Loop
'***** Next i ***** explication plus haut
For i = 0 To 999
'concanénation des valeurs du tableau dans un chaine
chaine = chaine & CStr(Montableau(0, i)) & ";" & CStr(Montableau(1, i)) & ";" _
& CStr(Montableau(2, i)) & ";" & CStr(Montableau(3, i)) & ";" _
& CStr(Montableau(4, i)) & vbCrLf
Next i
Close #1
'End If
'Text1.Text = chaine
'ecriture dans le nouveau fichier
Set FSys = CreateObject("Scripting.FileSystemObject")
Set MonFich = FSys.createtextfile("D:\Name.txt")
With MonFich
.writeline ("Num pts;U Alt; I Alt; % PID; U Exi;I Ext")
.writeline chaine
End With
End Sub
viclaudel
Messages postés13Date d'inscriptiondimanche 15 mars 2009StatutMembreDernière intervention19 mars 2009 16 mars 2009 à 22:45
Bonsoir, merci de m'avoir répondu. J'ai analysé ton code et j'ai compris le fonctionnent du tableau. Par contre j'ai essayé mais là rien de ne se passe. Il compile, il lit toutes les lignes. Il crée le nouveau fichier mais il n'y a rien.
Je vais encore regarder demain.
viclaudel
Messages postés13Date d'inscriptiondimanche 15 mars 2009StatutMembreDernière intervention19 mars 2009 16 mars 2009 à 22:48
oui j'ai essayé la méthode de puntch mais rien, je ne capture aucune donnée. Par contre d'avoir changer mais if là j'ai tout maintenant. Mais tout ce met sur une seule colonne dans mon nouveau fichier. Je n'arrive pas encore à séparer le tout.
viclaudel
Messages postés13Date d'inscriptiondimanche 15 mars 2009StatutMembreDernière intervention19 mars 2009 17 mars 2009 à 23:03
encore merci bon j'ai 2 colonnes maintenant mais je vais travailler pour avoir mes 5.
Peux m'explique la partie écriture, je pense comprendre que c'est pour gérer le tableau.
viclaudel
Messages postés13Date d'inscriptiondimanche 15 mars 2009StatutMembreDernière intervention19 mars 2009 18 mars 2009 à 23:39
Super merci ça marche, les 2 façons j'ai aussi modifié l'autre code. Je commence à comprendre la logique des tableaux mais c'est pas évident. Les voilà dont un on je suis en train de rajouter les erreurs.
Je te remercie de ton aide.
*********************************Premier*************************************
Private Sub transfert_Click()
Dim ColA()
Dim ColB()
Dim ColC()
Dim ColD()
Dim ColE()
Dim ColF()
Dim Nb As Long
Nb = 1
Dim Temp As String
Dim Nombre As String
'Recupération des données renseigner par l'opérateur
G_CheminFichier = TXT_Chemin_Fichier.Text
G_NomFichier = TXT_Nom_Fichier.Text
G_NomFichierText = TXT_Nom_Fichier_Texte.Text
'lecture, stockage, recup dans tableau
Open G_CheminFichier & G_NomFichier For Input As #1
Do While Not EOF(1)
Line Input #1, Temp
'si la ligne commence par AT extraction des chiffre en ()
If Mid(Temp, 1, 2) = "AT" Then
'If Left(Temp, 2) = "AT" Then
Dim PosDep As Integer
Dim PosFin As Integer
Dim t As Integer
If Nb = 1999 Then
Dim toto As Integer
toto = 1
End If
t = Nb
Text1.Text = t
Select Case Nb
Case 1 To 1000
ReDim Preserve ColA(Nb - 1)
ColA(Nb - 1) = Nombre
Case 1001 To 2000
ReDim Preserve ColB(Nb - 1 - 1000)
ColB(Nb - 1 - 1000) = Nombre
Case 2001 To 3000
ReDim Preserve ColC(Nb - 1 - 2000)
ColC(Nb - 1 - 2000) = Nombre
Case 3001 To 4000
ReDim Preserve ColD(Nb - 1 - 3000)
ColD(Nb - 1 - 3000) = Nombre
Case 4001 To 5000
ReDim Preserve ColE(Nb - 1 - 4000)
ColE(Nb - 1 - 4000) = Nombre
Case 5001 To 6000
ReDim Preserve ColF(Nb - 1 - 5000)
ColF(Nb - 1 - 5000) = Nombre
End Select
Nb = Nb + 1
End If
Loop
Close #1
'Test de la valeur
Dim valeurLimite As Long
valeurLimite = UBound(ColA)
If (valeurLimite <> UBound(ColB)) Or (valeurLimite <> UBound(ColC)) Or _
(valeurLimite <> UBound(ColD)) Or (valeurLimite <> UBound(ColE)) Then
'Gestion erreur
MSg = "Valeur pas valide"
MsgBox (MSg)
End
End If
'écriture du fichier dans nouveau fichier
Open ("D:\essai2.text") For Output As #1
Print #1, ("Num pts;U Alt; I Alt; % PID; U Exi;I Ext")
For i = 0 To UBound(ColA)
On Error Resume Next 'au cas ou il y a pas 5000 entré d extraite du fichier
Print #1, ColA(i) & ";" & ColB(i) & ";" & ColC(i) & ";" & ColD(i) & ";" & ColE(i) & ";"
Next i
Close #1
Dim Msg 'message de réussite
Dim i, Mypo, Mypo2, NbCar As Integer
Dim C, ReadC As String
Dim t, y As String
Dim Montableau(0 To 5, 0 To 999) As String
Dim chaine As Variant
Dim TailleFichierTexte, EcrasementFichier, ExistanceFichier As String 'renvoie la taille du fichier Texte
Dim TXT As String 'envoie l'extantion du fichier texte d'origine
'on récupére les données inscritent par l'utilisateur
G_CheminFichier = TXT_Chemin_Fichier.Text
G_NomFichier = TXT_Nom_Fichier.Text
G_NomFichierText = TXT_Nom_Fichier_Texte.Text
'vérification de lafin du fichier du chemin qui doit finir pa ""
'TailleFichierTexte = Trim(G_CheminFichier)
'TailleFichierTexte = Len(G_CheminFichier)
'Dans le cas ou rien n'est écrit on va au message erreur
'If TailleFichierTexte = "0" Then GoTo fin1
'TXT = Mid(G_CheminFichier, TailleFichierTexte)
'Si l 'extantion n'est pas correcte alors on arrete et on affiche un message d'erreur
'If TXT <> "" Then GoTo fin2
' Verification que le fichier texte d'origine à une extantion .TXT ou .txt
'TailleFichierTexte = Trim(G_NomFichier)
' TailleFichierTexte = Len(G_NomFichier)
' If TailleFichierTexte = "0" Then GoTo fin3
' TXT = Mid(G_NomFichier, TailleFichierTexte - 3)
'Si l'extantion n'est pas correcte alors on arrete et on affiche un message d'erreur
'If TXT <> ".txt" And TXT <> ".TXT" Then GoTo fin4
'Si l'extantion n'est pas correcte alors on arrete et on affiche un message d'erreur
'If TXT <> ".txt" And TXT <> ".TXT" And TXT <> ".dat" And TXT <> ".DAT" And TXT <> ".doc" And TXT <> ".DOC" Then GoTo fin2
' Verification que le fichier destination n'existe pas encore pour eviter d'ecraser des données
'EcrasementFichier = Dir(G_CheminFichier & G_NomFichier)
'If EcrasementFichier = G_NomFichierText Then GoTo fin6
' Verication que le fichier texte de destination à une extantion .TXT ou .txt ou .DAT ou .dat ou .DOC ou .doc
'TailleFichierTexte = Trim(G_NomFichierText)
'TailleFichierTexte = Len(G_NomFichierText)
'If TailleFichierTexte = "0" Then GoTo fin3
'TXT = Mid(G_NomFichierText, TailleFichierTexte - 3)
'Lecture
If G_NomFichier <> "" Then
'ouverture du fichier source
Open G_CheminFichier + G_NomFichier For Input As #1
'boucle sur 5000 lignes
i = 0
Do While i < 5000
'gestion d'erreur si moins de 5000 lignes
On Error Resume Next
'mise de la valeur dans un tableau en fonction du numéro de la ligne
If i <= 999 Then
Montableau(0, i) = C
ElseIf i <= 1999 Then
Montableau(1, i - 1000) = C
ElseIf i <= 2999 Then
Montableau(2, i - 2000) = C
ElseIf i <= 3999 Then
Montableau(3, i - 3000) = C
ElseIf i <= 4999 Then
Montableau(4, i - 4000) = C
End If
'comptage du nombre valeurs extraite et affichage
i = i + 1
t = i
Text3.Text = t
End If
Loop
For i = 0 To 999 'conétation des valeurs du tableau dans une chaine
Text1.Text = chaine
'ecriture dans le nouveau fichier
Open ("D:\Name.text") For Output As #1
Print #1, ("Num pts;U Alt; I Alt; % PID; U Exi;I Ext")
Print #1, chaine
Close #1
End If
Msg = ("FIN")
MsgBox (Msg)
fin1:
MsgBox "Veuillez entrer le chemin du fichier d'origine"
Command1.Enabled = True
Exit Sub
fin2:
MsgBox "Le chemin doit finir par le caractère \ , Exemple: C:\Program Files\ "
Command1.Enabled = True
Exit Sub
fin3:
MsgBox "Veuillez entrer le nom du fichier d'origine"
Command1.Enabled = True
Exit Sub
fin4:
MsgBox " Le nom du fichier saisi dans le champ 'Nom du fichier source .TXT' est faux, veuillez saisir par exemple 'essai.txt'"
Command1.Enabled = True
Exit Sub
fin5:
MsgBox "AucunFichier"
Command1.Enabled = True
Exit Sub
fin6:
MsgBox "EcrasementFichier"
Command1.Enabled = True
Exit Sub