Manipuler un fichier .txt via excel

atlas

XLDnaute Occasionnel
Bonjour , je suis en train de remanier un fichier .txt via excel .(un petit mélange vba – vbscript)
Le but est de filtrer les bonnes bonnes lignes et de les envoyer vers un nouveau fichier .txt appelé TEST.txt . A la main cela donne je sélectionne une ligne et je la colle dans un autre fichier + entreé pour passer à la ligne suivante .

Cependant , je rencontre une série de bugs .
1 er bug les mauvaises lignes sont quand même envoyées vers le fichier TEST.txt
Ce if
Code:
 If CInt(Trim(Ar(3))) <> 0 Or CInt(Trim(Ar(3))) <> 200 Or CInt(Trim(Ar(3))) <> 1536 Then …
ne filtre rien ..
2 ème bug les signes pipes | sont espacés , et il ne le faut pas*: la forme du nouveau fichier .txt doit rester strictement identique à celui d’origine
3ème bug au fur et à mesure que les lignes sont envoyées vers TEST.txt le retour à la ligne ne s’effectue pas .La dernière ligne écrasant la précédente .

Voici mon code , le fichier à manipuler est en pièce jointe

Code:
Option Explicit
Option Base 1

'le but du module et de nettoyer le fichier .txt
 Sub nettoietxt(numomega)

'1/Vérifie que le dossier Pnumomega existe !
'1.1/Si il existe pas alors exit sub ne fait rien

Dim dossiercherche As String
dossiercherche = "P" & numomega

Dim MyFile As String  

MyFile = Dir("C:\Documents and Settings\a\Bureau\Projet\" & dossiercherche, vbDirectory)  'vbdirectory se concentre sur les dossiers et exclu le reste

If Len(MyFile) > 0 Then  ' si c'est supérieur à 0 alors le dossier existe
                         ' et si le dossier existe alors le fichier .txt correspondant aussi
                         
Call creertxt(dossiercherche)
Call lancenettoiebis(dossiercherche, MyFile)

Else
Exit Sub      'sinon quitte
End If

End Sub

Private Function creertxt(dossiercherche) '

Dim objfichier, monnouveaufichier As Variant

Set objfichier = CreateObject("Scripting.FileSystemObject")
Set monnouveaufichier = objfichier.CreateTextFile("C:\Documents and Settings\a\Bureau\Projet\" _
& dossiercherche & "\" & "TEST.txt", True) 'creer un fichier TEST.txt vide
                                           'qui recevra uniquement les bonnes lignes
                                           ' les lignes seront copies une à une 
                                           ' vers TEST.tx ensuite le mauvais est supprimé
                                           'et TEST.txt est renommé sous le bon nom avec les bonnes lignes
Set objfichier = Nothing
Set monnouveaufichier = Nothing

End Function

Function lancenettoiebis(dossiercherche, MyFile)

Dim Chaine As String
Dim Ar() As String
Dim i, iRow As Long, iCol As Long
Dim NumFichier As Integer
Dim Separateur  As String

Separateur = Chr(124) '  Chr(124) '124 représent le signe pipe
'Cells.Clear
NumFichier = FreeFile ' 1/ Attribue un numéro de fichier
iRow = 1

'Open "C:\Documents and Settings\a\Bureau\Projet\" & dossiercherche & "\" & "TEST.txt" _
'For Input As #NumFichier  'ici imput# non pas imput tout court
Dim chemin As String
chemin = "C:\Documents and Settings\a\Bureau\Projet\" & dossiercherche & "\"

Open chemin & dossiercherche & ".txt" _
For Input As #NumFichier  

Do While Not EOF(NumFichier)  '3/ EOF (end of file) est une fonction importante
                              ' tant que la lecture de la fin de fichier n'est pas atteinte
iCol = 1
Line Input #NumFichier, Chaine  ' 3.1/Lit ligne par ligne le fichier ouvert en mode séquentiel
Debug.Print Chaine   ' pour voir les chaines du fichiers text dans la console


Ar = Split(Chaine, Separateur, 5)   ' 5 car j'aie besoin uniquement des 4 premieres séparations
If CInt(Trim(Ar(3))) <> 0 Or CInt(Trim(Ar(3))) <> 200 Or CInt(Trim(Ar(3))) <> 1536 Then
'if ne filtre rien !
'ouvre le fichier TEST et copie la variable chaine ds le fichier TEST.txt
Call ouvreetcopie(chemin, Chaine)
End If

iRow = iRow + 1
Loop
Close #NumFichier

End Function

Private Function ouvreetcopie(chemin, Chaine)

Dim NumFichier1 As Integer
NumFichier1 = FreeFile '

Open chemin & "TEST.txt" _
For Input As #NumFichier1

Dim fichierTEST, ecritdsfichier As Variant

'SetfichierTEST=CreateObject("Scripting.TextStream")                                            'fichierTEST.TextStream.WriteLine (Chaine)  'décevant je ne parviens pas à utiliser 'la méthode TextStream .Je me rabat donc sur la solution avec OpenTextFile

Set fichierTEST = CreateObject("Scripting.FileSystemObject")
Set ecritdsfichier = fichierTEST.OpenTextFile(chemin & "TEST.txt", ForWriting, True)
'erreur d'execution 5 argument ou appel de procèdure incorrect

ecritdsfichier.WriteLine Chaine & Chr(13) & Chr(10) ' Chr(13) & Chr(10) incompris le retour
                                                    ' à la ligne n'est pas éffectué


Close #NumFichier1

Set fichierTEST = Nothing
Set ecritdsfichier = Nothing

End Function
 

Pièces jointes

  • P31475.TXT.zip
    802 bytes · Affichages: 44

JNP

XLDnaute Barbatruc
Re : Manipuler un fichier .txt via excel

Bonjour le fil :),
Salut, Code : ouvert, fermé, puis poubelle
Euh, pas essayé le code, une véritable usine à gaz :p...
A adapter pour les chemins
Code:
Sub Test()
Dim Chaine, Tableau, I As Long
Open "C:\temp\Test1.txt" For Input As #1
Open "C:\temp\Test2.txt" For Output As #2
Do While Not EOF(1)
    Line Input #1, Chaine
    Tableau = Split(Chaine, "|")
    If IsNumeric(Replace(Tableau(3), " ", "")) Then
        I = Replace(Tableau(3), " ", "") * 1
    If I <> 0 And I <> 200 And I <> 1536 Then Print #2, Chaine
    End If
Loop
Close #1
Close #2
End Sub
Bonne journée :cool:
 

atlas

XLDnaute Occasionnel
Re : Manipuler un fichier .txt via excel

Me revoilà et , comme je suis très méchant , je vais encore faire un dégazage sauvage de cradocode sur internet flux transport …

Ci-dessous 0 bug , 0 tracas …
Par contre je me demande si il existe une méthode plus jolie pour nettoyer 1 fichier que de créer un nouveau fichier lui envoyer les infos , supprimmer l’ancien fichier et renommer le nouveau du nom de l’ancien …

Code:
Option Explicit
Option Base 1

'le but du module et de nettoyer le fichier .txt
 Sub nettoietxt(numomega)

Dim dossiercherche As String
dossiercherche = "P" & numomega

Dim MyFile As String  ', MyPath, MyName
MyFile = Dir("C:\Documents and Settings\a\Bureau\Projet\" & dossiercherche, vbDirectory)

If Len(MyFile) > 0 Then  ' si c'est supérieur à 0 alors le dossier existe
                         ' et si le dossier existe alors le fichier .txt correspondant aussi
Call Test(dossiercherche)
Kill "C:\Documents and Settings\a\Bureau\Projet\" & dossiercherche & "\" & dossiercherche & ".txt"
Name "C:\Documents and Settings\a\Bureau\Projet\" & dossiercherche & "\" & "TEST.txt" As _
      "C:\Documents and Settings\a\Bureau\Projet\" & dossiercherche & "\" & dossiercherche & ".txt"

Else
Exit Sub      'sinon quitte
End If

End Sub

Sub Test(dossiercherche)

Dim Chaine, Tableau, I As Long

Open "C:\Documents and Settings\a\Bureau\Projet\" & dossiercherche & "\" & dossiercherche & ".txt" For Input As #1
Open "C:\Documents and Settings\a\Bureau\Projet\" & dossiercherche & "\" & "TEST.txt" For Output As #2

Do While Not EOF(1)
    Line Input #1, Chaine
    Tableau = Split(Chaine, "|")
    If IsNumeric(Replace(Tableau(3), " ", "")) Then
        I = Replace(Tableau(3), " ", "") * 1
    If I <> 0 And I <> 200 And I <> 1536 And I <> 1539 And I <> 901 _
    And I <> 905 And I <> 908 And I <> 909 Then
    Print #2, Chaine
    End If
    End If
Loop
Close #1
Close #2

End Sub
 

JNP

XLDnaute Barbatruc
Re : Manipuler un fichier .txt via excel

Re :),
Me revoilà et , comme je suis très méchant , je vais encore faire un dégazage sauvage de cradocode sur internet flux transport …
Très méchant, peut-être, impoli, très certainement :mad:...
Après t'avoir converti une 50aine de ligne de code inefficace en une 10aine de ligne efficaces, on peut s'attendre à un autre type de réponse :eek:...
Oui, la 30aine de ligne en dehors de mon code doit pouvoir être résumée en 5 à 10 lignes, mais pour que je m'y intéresse, il faudrait que le demandeur soit plus humble :eek:...
Salutations pas très sincères :mad:...
 

Discussions similaires

Statistiques des forums

Discussions
312 218
Messages
2 086 366
Membres
103 197
dernier inscrit
sandrine.lacaussade@orang