XL 2019 Fichier ".txt" de plus de 2.000.000 de lignes !

Titof06

XLDnaute Junior
Bonjour,

J'ai à traiter un fichier texte de plus de 2.000.000 de lignes.

Excel n'accepte qu'environ 1.500.000 lignes.

Je dois extraire des informations relatives à des mises à jour de fournisseurs et par rapport à une date précise.

Est-ce que quelqu'un pourrait me conseiller un logiciel ou une façon de sortir des informations de ce méga fichier texte, svp ?

Par avance, Merci 👍

Bonne Journée, Titof06 :)
 

job75

XLDnaute Barbatruc
Bonjour Titof06, le forum,

Avant de m'occuper des dates j'ai testé la macro en créant un fichier source de 2 000 000 de lignes (2 fournisseurs et 2 dates), chez moi il pèse 284 Mo !

Ceci afin de créer un fichier et une feuille de 1 000 000 de lignes (1 fournisseur et 1 date).

Et je me suis alors aperçu que la macro du post #13 ne va pas, à cause de cette concaténation :
VB:
d(code) = d(code) & vbLf & texte
qui prend énormément de temps.

J'ai donc changé mon fusil d'épaule et créé cette macro :
VB:
Sub Creer_feuilles_fournisseurs()
Dim datedeb As Date, datefin As Date, coldate%, chemin$, fournisseurs$, fichier$, w As Worksheet
Dim Source, n%, d As Object, x%, tablo, ub&, i&, s, dat$, code$, j&, nomfeuille$
datedeb = DateValue("01/03/2024") 'à adapter
datefin = Date 'date du jour
coldate = 8 'numéro de colonne à adapter
chemin = ThisWorkbook.Path & "\"
fournisseurs = chemin & "Fournisseurs\"
If Dir(fournisseurs, vbDirectory) = "" Then MkDir fournisseurs 'crée le sous-dossier
fichier = Dir(fournisseurs & "*.txt")
'---vide le sous-dossier---
While fichier <> ""
    Kill fournisseurs & fichier
    fichier = Dir
Wend
'---supprime les feuillea---
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each w In Worksheets
    If UCase(w.Name) <> "ACCUEIL" Then w.Delete
Next w
'---création des fichiers et feuilles fournisseurs---
Source = Array("famrem_sacha_Pour Test.txt", "hzn_sacha_Pour Test.txt") 'à adapter
For n = 0 To UBound(Source)
    Set d = CreateObject("Scripting.Dictionary")
    x = FreeFile
    Open chemin & Source(n) For Input As #x 'ouverture en lecture séquentielle
    tablo = Split(Input(LOF(x), #x), vbCrLf)
    ub = UBound(tablo)
    Close #x
    '---création des fichiers---
    For i = 1 To ub
        s = Split(tablo(i), ";", coldate + 1)
        If UBound(s) + 2 > coldate Then
            dat = s(coldate - 1)
            If IsDate(dat) Then
                If CDate(dat) >= datedeb And CDate(dat) <= datefin Then
                    code = s(0) 'code fournisseur
                    If Not d.exists(code) Then
                        d(code) = ""
                        fichier = fournisseurs & "F" & Format(n + 1, "00") & code & ".txt"
                        x = FreeFile
                        Open fichier For Output As #x 'ouverture en écriture séquentielle
                        Print #x, tablo(0)
                        For j = i To ub
                            s = Split(tablo(j), ";", coldate + 1)
                            If UBound(s) + 2 > coldate Then
                                If s(0) = code Then
                                    dat = s(coldate - 1)
                                    If IsDate(dat) Then If CDate(dat) >= datedeb And CDate(dat) <= datefin Then Print #x, tablo(j)
                                End If
                            End If
                        Next j
                        Close #x
                    End If
                End If
            End If
        End If
    Next i
    '---création des feuilles---
    If d.Count Then
        tablo = d.keys
        '---création des feuilles---
        For i = 0 To UBound(tablo)
            nomfeuille = "F" & Format(n + 1, "00") & tablo(i)
            fichier = fournisseurs & nomfeuille & ".txt"
            Sheets.Add After:=Sheets(Sheets.Count)
            ActiveSheet.Name = nomfeuille
            With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fichier, Destination:=ActiveSheet.Cells(1))
                .TextFilePlatform = 65001 'origine UTF-8
                .TextFileParseType = xlDelimited
                .TextFileSemicolonDelimiter = True
                .Refresh
                .Parent.Names(.Name).Delete 'supprime le nom défini dans la feuille
                .Delete 'supprime la requête
            End With
        Next i
    End If
Next n
Sheets(1).Activate
End Sub
Edit : en limitant les Split à coldate + 1 donc 9 c'est plus rapide.

Sur le fichier de 2 000 000 de lignes elle s'exécute en 77 secondes, dont 29 secondes pour la création du fichier et 48 secondes pour la création de la feuille de 1 000 000 de lignes.

Avec les fichiers joints, le 1er fichier source n'a pas de date donc aucune ligne n'est copiée.

A+
 

Pièces jointes

  • Créer feuilles fournisseurs.xlsm
    25.7 KB · Affichages: 5
  • famrem_sacha_Pour Test.txt
    573 bytes · Affichages: 5
  • hzn_sacha_Pour Test.txt
    1.4 KB · Affichages: 5
Dernière édition:

oguruma

XLDnaute Occasionnel
Bonjour, je fais simple : PowerQuery+PowerPivot sont tes amis.... en effet tu n'as certainement pas besoin d'imprimer 2000 000 de lignes mais certainement en tirer des KPI, KRI, des TCD ou faire des extractions et y ajouter du code en DAX pour calculer tes mesures
SI tu veux t'initier au PowerQuery voir mes Post et ceux aussi d'autres experts du forum
Alternative sympathique qui est top : PowerBI qui réuni toutes les fonctions de PowerQuery, toutes les possibilités offertes par PowerPivot et son langage DAX... mais cela demande un autre investissement....
J'essaie d'y regarder en PowerQuery et je reviens vers toi
 

oguruma

XLDnaute Occasionnel
Salut @Titof06 ,

PowerQuery inclus dans Excel peut TRAITER bien plus de lignes... a condition de ne pas les montrer.

je suis monté a 22 millions de lignes.

on peut soit les filtrer, les pivoter (passer des lignes en colonnes) , créer des TCD,...

Merinos
En phase.... je suis aussi monté à cette volumétrie... en revanche quand ça monte dans PowerPivot il faut être patient
 

oguruma

XLDnaute Occasionnel
Bonjour,

J'ai à traiter un fichier texte de plus de 2.000.000 de lignes.

Excel n'accepte qu'environ 1.500.000 lignes.

Je dois extraire des informations relatives à des mises à jour de fournisseurs et par rapport à une date précise.

Est-ce que quelqu'un pourrait me conseiller un logiciel ou une façon de sortir des informations de ce méga fichier texte, svp ?

Par avance, Merci 👍

Bonne Journée, Titof06 :)
Peux-tu fournir un extrait de ton fichier et ce que tu souhaites comme extraction.... après la mécanique sera la même qq soit la volumétrie..... un fichier de 5000 à 10 000 zippé pourrait faire l'affaire avec de quoi traiter et mettre en place des extractions
 

oguruma

XLDnaute Occasionnel
Bonjour le forum,

Pour aller un peu plus vite j'ai limité les Split à coldate + 1 donc 9.

Je dépose le fichier de 2000 000 de lignes zippé sur cjoint.com :

https://www.cjoint.com/c/NFjonOrLU2u

A+
@Tifo06 : Je vais partir du fichier hzn_sacha_Pour Test que je viens de télécharger et je te monte un exemple de TCD en passant par du PowerQuery+PowerPivot+Dax avec un TCD....
Je te fais cela quand je peux... tu auras au moins une base de travail pour d'autres fichiers de cette volumétrie
 

merinos-BernardEtang

XLDnaute Accro
En phase.... je suis aussi monté à cette volumétrie... en revanche quand ça monte dans PowerPivot il faut être patient
J'ai pas trop de probleme: je travaille avec une serie de tables liées... donc celle de grand volume ne contient que des données volumétriques( prix de revient, prix de vente, quantité) et de quoi faire les liens temporels geographiques et aux produits vendus. Soit 6 colonnes.

Mais c'est pour cela que j'ai passé la mémoire du PC à 32 GB...
 

oguruma

XLDnaute Occasionnel
J'ai pas trop de probleme: je travaille avec une serie de tables liées... donc celle de grand volume ne contient que des données volumétriques( prix de revient, prix de vente, quantité) et de quoi faire les liens temporels geographiques et aux produits vendus. Soit 6 colonnes.

Mais c'est pour cela que j'ai passé la mémoire du PC à 32 GB...
Mais c'est pour cela que j'ai passé la mémoire du PC à 32 GB... ==> tout s'explique..... :)
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Petite précision sur la macro de mon post #20.

Si le fichier .txt créé dépasse 1048576 lignes il n'y a pas de problème.

ActiveSheet.QueryTables.Add limite le tableau créé dans la feuille au nombre de lignes possibles.

A+
 

Discussions similaires

Statistiques des forums

Discussions
315 098
Messages
2 116 197
Membres
112 680
dernier inscrit
AKDS