Import de plusieurs fichiers txt

  • Initiateur de la discussion Initiateur de la discussion Fab57330
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

F

Fab57330

Guest
Bonsoir.
Je viens aujourd'hui vers vous car j'ai un petit soucis. Je dois importer 3 fichiers txt (numérotés de 1 à 3). Chaque fichier fait plus de 700.000 lignes (donc j'utiliser EXCEL 2007). Dans ce fichier, j'ai une colonne apellée "VITESSE", qui quelque fois a des valeurs "0". Toute les autres colones ont des fois des NaN.

Le but est en fait de réaliser un import des fichiers, les uns a prés les autres, cependant uniquement des lignes ou la vitesse n'est pas égale a zero, et ou dans les autres colones je n'ai pas de valeurs NaN.

On m'a conseiller d'utiliser la fonction suivante:

Code:
Open "l:/1.txt" For Input As #1
 

Do While Not EOF(1)
    Input #1, Ligne
    NBLigne = NBLigne + 1                           'récupère le nombre de ligne du fichier
    
    tableau = Split(Ligne, vbTab)
    
    Sheets(1).Cells(NBLigne, 1) = tableau(0)
    Sheets(1).Cells(NBLigne, 2) = tableau(1)
        
Loop
 
Close

Cependant, je ne trouve pas beaucoup de documentation sur cette fonction, du moins avec ce que je sougaite faire.

Quelqu'un pourrait-il m'aider SVP?

Merci,
Fab.
 
Re : Import de plusieurs fichiers txt

C'est ce que j'ai fait a la base, cependant:
Fichier 1: 10 minutes
Fichier 2: 30 minutes
Fichier 3: Saturation mémoire

Donc pour ca que je passe par une autre méthode que ca lol
 
Re : Import de plusieurs fichiers txt

Bonjour.
Veuillez m'excuser de ne pas être revenu vers vous avant, cependant j'ai eu une fin de semaine
PHP:
 assez chargée :'(...

Voici le code dont je vous parlais qui fonctionne en partie :

[CODE]
Sub essai_2()
    Const ForReading = 1, ForWriting = 2, ForAppending = 3
    Dim fs, f, tableau, i, j
    Dim Ligne As Double
    Dim PasEnregistrement As Boolean
    
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.OpenTextFile("C:\Utilisateurs\OLIER Fabrice\PRESENTATION FLUX\L3\test.txt", ForReading, TristateFalse)
    Application.ScreenUpdating = False
    
''''''''''''''''''''''''''''''''''''''''''''''
''' DEBUT DE LA BOUCLE D'IMPORT DU FICHIER '''
''''''''''''''''''''''''''''''''''''''''''''''

    Do While f.AtEndOfLine <> True 'Boucle tant que l'on atteint pas la fin du fichier
        PasEnregistrement = False
        tableau = Split(f.Readline, vbTab)
        For i = 0 To UBound(tableau)
            If tableau(i) = "NaN (Niet-een-getal)" Then
                PasEnregistrement = True
                Exit For
            End If
        Next i
            
        If PasEnregistrement = False Then
            Ligne = Ligne + 1
                For j = 0 To UBound(tableau)
                    Sheets("WORKSHEET").Cells(Ligne, j + 1) = tableau(j)
                Next j
        Else:
        End If
    Loop

    f.Close 'Fermeture du fichier
    
''''''''''''''''''''''''''''''''''''''''''''''
'''  FIN DE LA BOUCLE D'IMPORT DU FICHIER  '''
''''''''''''''''''''''''''''''''''''''''''''''
End Sub[/CODE]

Comme inscrit précédement, le code EOF ne permettait pas comme l'import de ma ligne entière: Il prennait comme séparateur principal la virgule, puis ensuite la tabulation. En regardant l'aide, il est inscrit que c'est normal et non paramétrable.

A ce jours, je tente de trouver la solution par rapport au code ci-dessus. Il n'importe pour le moment pas les lignes contenant des valeurs "NaN...". Je vais voir pour faire de même avec les vitesses égales à 0 ainsi que les cellules vides:
1. Si cellule vide, alors vérification de la valeur i+1
2. Si toujours vide, alors vérification de la valeur i+1
2a. Si pas vide, alors import de la valeur
3. Etc...

Cependant je constate que le code ci-dessous implique un travail double:
1. Il lis mes valeurs entière, si OK il les importe, sinon il importe pas. En clair, je fais un double import... Une solution existerai afin de ne pas faire deux fois le travail pour une ligne?

Merci d'avance,
Fabrice.
 
Re : Import de plusieurs fichiers txt

Bonsoir.
Voila, j'ai réussi a faire ce que je voulais:

Code:
Sub essai_2()
    Const ForReading = 1, ForWriting = 2, ForAppending = 3
    Dim fs, f, tableau, i, j, k
    Dim Ligne As Double
    Dim PasEnregistrement As Boolean
    
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.OpenTextFile("C:\Users\Fabdu57100\Desktop\L3\test.txt", ForReading, TristateFalse)
    Application.ScreenUpdating = False
    
''''''''''''''''''''''''''''''''''''''''''''''
''' DEBUT DE LA BOUCLE D'IMPORT DU FICHIER '''
''''''''''''''''''''''''''''''''''''''''''''''

    Do While f.AtEndOfLine <> True 'Boucle tant que l'on atteint pas la fin du fichier
        PasEnregistrement = False
        tableau = Split(f.Readline, vbTab)
        For i = 0 To UBound(tableau)
            If i = 8 Then
                If tableau(8) = 0 Then
                    PasEnregistrement = True
                    Exit For
                Else:
                End If
            Else:
                If tableau(i) = "NaN (Niet-een-getal)" Or tableau(i) = "QueryInfo" Then
                    PasEnregistrement = True
                    Exit For
                End If
            End If
        Next i
            
        If PasEnregistrement = False Then
            Ligne = Ligne + 1
            
                For j = 0 To UBound(tableau)
                    Sheets("WORKSHEET").Cells(Ligne, j + 1) = tableau(j)
                Next j
        Else:
        End If
    Loop

    f.Close 'Fermeture du fichier
    
''''''''''''''''''''''''''''''''''''''''''''''
'''  FIN DE LA BOUCLE D'IMPORT DU FICHIER  '''
''''''''''''''''''''''''''''''''''''''''''''''
End Sub

Cependant, le temps de chargement est... TRES TRES TRES lent... Une idée du problème? N'irais-je pas plus vite si au lieu d'importer directement sous EXCEL j'écris mes lignes dans un fichier texte que j'importerai en phase finale?

Merci d'avance,
Fabrice.

PS: Ci-joint mon fichier "test" permettant d'essayer. A noter que j'ai suprimmer beaucoup de lignes: Au final 13 lignes restantes sur les 700.000 initiales...
 

Pièces jointes

Re : Import de plusieurs fichiers txt

Bonjour Fab57330, Bonjour à tous
Une proposition pour aller plus vite, mais sur 700 000 lignes je ne garantie rien...
VB:
Sub essai_2()
Dim fs As Object, f As Object, tableau As Variant, i&
Dim PasEnregistrement As Boolean
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile("C:\Users\Fabdu57100\Desktop\L3\test.txt")
Application.ScreenUpdating = False
Do While f.AtEndOfLine <> True
    tableau = Split(f.Readline, vbTab)
    If UBound(tableau) >= 8 Then
        If tableau(8) <> 0 Then
            For i = 0 To UBound(tableau)
                If tableau(i) = "NaN (Niet-een-getal)" Or _
                        tableau(i) = "QueryInfo" Then
                    PasEnregistrement = True
                    Exit For
                End If
            Next i
        End If
    End If
    If PasEnregistrement = False Then _
        Sheets("WORKSHEET").Cells(Rows.Count, 1).End(3)(2).Resize(1, UBound(tableau)) = tableau
    PasEnregistrement = False
Loop
f.Close 'Fermeture du fichier
End Sub

Cordialement
 
Re : Import de plusieurs fichiers txt

Bonjour.
J'ai trouvé la ruse pour les "0" ainsi que ecrire dès la première ligne.
Cependant, il m'importe tous les nombres en tant que texte. Est-ce possible de palier a cela?

Merci d'avance,
Fabrice.
 
Re : Import de plusieurs fichiers txt

Re
Commençons par les mauvaises nouvelles :
[😡] Ce n'est pas très sympa de multiplier les questions sur des forums différents en copiant / colant tes posts[/😡]

Pour les retours chariots, c'est une blague (mauvaise certe, mais une blague)

Pour le reste:
J'ai changé de principe. On peux aller beaucoup plus vite en créant un fichier .csv dans le même classeur que le fichier texte à traiter
Le classeur exemple ne sert qu'a porter le code et le bouton, c'est pour cela qu'il n'y a rien d'autre....
VB:
Private Sub CommandButton1_Click()
Dim DebTot!
Dim i&, tableau As Variant
Dim fichier$, FicTmp$, chainetexte$, Pth$
Pth = "C:\Users\Fabdu57100\Desktop\L3\"
DebTot = Timer
fichier = Pth & "test.txt"
FicTmp = Pth & "Test.Csv"
Open fichier For Input As #1
Open FicTmp For Output As #2
    Do While Not EOF(1)
        Line Input #1, chainetexte
        tableau = Split(chainetexte, vbTab)
        If tableau(0) = "QueryInfo" Then GoTo Suite
        If Not IsError(Application.Match("NaN (Niet-een-getal)", tableau, 0)) Then GoTo Suite
        If UBound(tableau) > 7 Then
            If tableau(8) = 0 Then GoTo Suite
        End If
        Print #2, Join(tableau, ";")
Suite:
    Loop
Close #2: Close #1
MsgBox Timer - DebTot
End Sub

Dans le code j'ai mis en commentaire les dernières lignes qui peuvent servirent à créer et mettre en forme un fichier .xlsx toujours dans le même dossier. Cela peut être long à cause du poids du fichier csv à ouvrir.

Dis mois ce que tu en pense...

Cordialement
 

Pièces jointes

Dernière édition:
Re : Import de plusieurs fichiers txt

Bonsoir.
Je testerai le code demain et vous tiendrai informé du temps d'execution. Cependant, je pense que ainsi je gagnerai énormément de temps car tout se passe hors d'EXCEL.

Merci d'avance,
Fab.
 
Re : Import de plusieurs fichiers txt

Bonsoir,
Désolé pour le retard dans ma réponse.

Le code fonctionne Nikel. deux minutes trente pour faire ce qu'avant je faisais en une heure... Super code.

J'ai juste encore une question... Est-ce possible de ne pas importer les multiples cellules vides a partir de la première ligne de donnée? En fait les successions de TABULATION.

Merci,
Fabrice.
 
Re : Import de plusieurs fichiers txt

Bonjour Fab57330, le fil, le forum
Content de voir que tu as retrouvé le chemin de ce fil 🙄
Pour ta nouvelle question on peut essayer ceci, mais les en tête seront décalées.
VB:
Private Sub CommandButton1_Click()
Dim i&, tableau As Variant, Tableau2 As Variant
Dim fichier$, FicTmp$, chainetexte$, Pth$
Pth = "C:\Users\Fabdu57100\Desktop\L3\"
fichier = Pth & "test.txt"
FicTmp = Pth & "Test.Csv"
Open fichier For Input As #1
Open FicTmp For Output As #2
    Do While Not EOF(1)
        Line Input #1, chainetexte
        tableau = Split(chainetexte, vbTab)
        If tableau(0) = "QueryInfo" Then GoTo Suite
        If Not IsError(Application.Match("NaN (Niet-een-getal)", tableau, 0)) Then GoTo Suite
        If UBound(tableau) > 7 Then
            If tableau(8) = 0 Then GoTo Suite
        End If
        ReDim Tableau2(0 To 0)
        For i = LBound(tableau) To UBound(tableau)
            If tableau(i) <> "" Then
                ReDim Preserve Tableau2(1 To UBound(Tableau2) + 1)
                Tableau2(UBound(Tableau2)) = tableau(i)
            End If
        Next i
        Print #2, Join(Tableau2, ";")
Suite:
    Loop
Close #2: Close #1
End Sub
Cordialement
 
Re : Import de plusieurs fichiers txt

Bonjour.
Dans ce cas, je ne vais pas faire ceci. Je ferais un traitement a postériori une fois la macro terminée.

Merci mille fois encore pour l'aide.

Bonne journée,
Fab.
 
Re : Import de plusieurs fichiers txt

Re
Si tu repasses par ici, avec ça on conserve les en tête en position.
VB:
Private Sub CommandButton1_Click()
Dim i&, j%, tableau As Variant, Tableau2 As Variant, PremLign As Boolean
Dim fichier$, FicTmp$, chainetexte$, Pth$
Pth = "C:\Users\Fabdu57100\Desktop\L3\"
fichier = Pth & "test.txt"
FicTmp = Pth & "Test.Csv"
Open fichier For Input As #1
Open FicTmp For Output As #2
    Do While Not EOF(1)
        Line Input #1, chainetexte
        tableau = Split(chainetexte, vbTab)
        If tableau(0) = "QueryInfo" Then GoTo Suite
        If Not IsError(Application.Match("NaN (Niet-een-getal)", tableau, 0)) Then GoTo Suite
        If UBound(tableau) > 7 Then
            If tableau(8) = 0 Then GoTo Suite
        End If
        ReDim Tableau2(0 To 0)
        If PremLign = False Then
            For i = LBound(tableau) To UBound(tableau) - 2
                If tableau(i) <> "" Then
                    For j = 0 To 2
                        ReDim Preserve Tableau2(1 To UBound(Tableau2) + 1)
                        Tableau2(UBound(Tableau2)) = tableau(i + j)
                    Next j
                End If
            Next i
            PremLign = True
        Else
            For i = LBound(tableau) To UBound(tableau)
                If tableau(i) <> "" Then
                    ReDim Preserve Tableau2(1 To UBound(Tableau2) + 1)
                    Tableau2(UBound(Tableau2)) = tableau(i)
                End If
            Next i
        End If
        Print #2, Join(Tableau2, ";")
Suite:
    Loop
Close #2: Close #1
End Sub
Cordialement
 
Re : Import de plusieurs fichiers txt

Bonsoir.

Merci mille fois pour ton aide. Je viens d'essayer, ca fonctionne impec. Maintenant me reste plus qu'a finaliser mon formulaire.

Bonne soirée,
Fabrice.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

D
  • Question Question
2
Réponses
28
Affichages
2 K
Deleted member 441486
D
H
Réponses
3
Affichages
1 K
Hotburn
H
Réponses
2
Affichages
1 K
Réponses
2
Affichages
701
Retour