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

oguruma

XLDnaute Occasionnel
Dans l'attente de la livraison d'une nouvelle version pwq avec passage en paramètre du nom du champ date à filtrer je vais tenter d'apporter une conclusion sur ce long roman :
J'aurai défendu VBA à 10 000 % pour l'importation de fichier .txt, .csv jusqu'à la V2013 d'Excel.
Pwq existait en Add-on à partir de la V2010, encore tout jeune, peinture non sèche et très peu connu.
Intégré dans la V2013 mais a commencé à bien se développer et à prendre son envol à partir de la V2016.
Or aujourd'hui passer par du VBA propriétaire et complexe pour pour importer un fichier .csv est à mon sens une grossière erreur. Nous avons tout ce qu'il nous faut dans PowerQuery et son langage M. Certes cela mérite quelques investissements mais sur la toile ça commence à se développer et il existe de nombreuses ressources. Il faut juste comprendre comment est structuré un code en M et comment fonctionne le bloc let...in.
Personnellement je ferai appel à du VBA quand j'aurai exploité toutes les solutions en Pwq. Voir je ferai une 1ère trame en Pwq pour la fignoler en VBA. C'est ce que j'ai été amené à faire à l'extrême dans mon projet précédent après bien nettoyé et présenté les données en pwq. Mais je m'appuyais au préalable sur le résultat d'une requête pour construire mon code en VBA. Donc je n'avais plus le soucis du nettoyage comme on l'aurait fait dans le passé avec du VBA.
Donc concentrer quand cela est possible, vos développements sur Pwq, on ne peut plus passer à côté.
Bien à vous :)
Ps : j'ai commencé un "RedBook" sur le langage M. J'en ferai part dès qu'il sera terminé
 
Dernière édition:

oguruma

XLDnaute Occasionnel
Bonsoir, suite aux diverses discussions et comme proposé voici l'utilitaire promis : https://excel-downloads.com/threads...election-dynamique-entre-deux-dates.20083419/
Tenez-moi informé SVP des difficultés ou des dysfonctionnements du code. J'ai certes fait un bon nombre de tests et sécurisé au maximum pour éviter les plantages mais je ne suis pas certain d'avoir tout balayer.
Après pour les chevronnés en Pwq et M je vous laisse aménager le code à votre guise.
 

oguruma

XLDnaute Occasionnel
Salut Oguruma,

C'est vrai que le description par Microsoft est loin d'être complete...

Merinos
hi, d'autant plus que leurs exemples sont soit inadaptés soit trop compliqués pour une 1ère lecture destinée à des débutants... on s'attend à des exemples simples et on arrive dès le 1er à du compliqué de quoi fermer la page immédiatement
 

oguruma

XLDnaute Occasionnel
bonjour, @merinos, Bonjour, tu as testé" chez toi stp ? et ? good ou pas ?
merci bonne journée et bon we

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 :)
Bonjour à tous,

Voici une version 2.0 avec la possibilité de placer des critères dates et texte. Je vous laisse découvrir
 

Titof06

XLDnaute Junior
Bonjour oguruma et laurent950,

Je suis désolé pour cette réponse tardive, j'étais en vacances.

Je vous remercie pour ces diverses que je vais essayer d'appliquer pour mes besoins.

Vous m'avez ouvert, plusieurs solutions, qui a mon gout, vont pouvoir s'adapter à mes besoins.

Encore un très grand MERCI !

Bonne Journée,

Titof06
 

laurent950

XLDnaute Barbatruc
Bonsoir @job75 , @oguruma

comme je n'arrive pas a faire fonctionner votre code @job75 j'ai créer celui-ci qui est aussi ultra rapide, peut même beaucoup plus que le votre !
avec votre fichier en Poste #58 avec mon ordinateur : ci-dessous
1719346819237.png


ci vous avez la solution pour le faire fonctionner et comparer je pense que mon ordinateur n'est pas assez performant.

et cela j'ai pas compris aussi
Sur 2 000 000 de lignes on en est chez moi à 50 secondes. (Chez moi 65,46 sec)

Edit : ajouté i = j - 1 ce qui réduit la durée à 39 secondes : ????


Avec votre fichier texte en poste #58 (J'ai effacer les lignes vides a la fin du fichier texte = 3 de mémoire retour a la ligne donc lignes vides)
1719346724221.png



VB:
Sub CréationFichierFournisseurAvecFiltreDate()
    ' Ultra rapide
    Dim t As Single
    Dim fournisseurs As String
    Dim filePath As String
    Dim FSO As Object
    Dim myFile As Object
    Dim RubGlobal As Collection
    Dim x As Integer
    Dim fichier As String
    Dim ID As String
    Dim Values As String
    Dim fileHandles As Object
    Dim fileHandle As Variant
    Dim datedeb As Date
    Dim datefin As Date
    Dim dateValue As Date
  
    ' Définir les dates de début et de fin
    datedeb = CDate("01/03/2022")
    datefin = Date
  
    ' Chemin du fichier texte à ouvrir
    filePath = Application.GetOpenFilename("Fichiers TXT (*.txt), *.txt")
    If filePath = "Faux" Then Exit Sub ' Si l'utilisateur annule
  
    ' Timer
    t = Timer
  
    ' Dossier (Fichier Fournisseurs)
    fournisseurs = ThisWorkbook.Path & "\Fournisseurs\"
    If Dir(fournisseurs, vbDirectory) = "" Then MkDir fournisseurs ' Crée le sous-dossier
    fichier = Dir(fournisseurs & "*.csv")
  
    ' Test si le sous-dossier n'est pas vide, suppression de tous les fichiers
    While fichier <> ""
        Kill fournisseurs & fichier
        fichier = Dir
    Wend
  
    ' Instanciation des variables FSO et myFile
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set myFile = FSO.OpenTextFile(filePath, 1)
  
    ' Racine (Collection)
    Set RubGlobal = New Collection
    Values = myFile.ReadLine
    RubGlobal.Add Item:=Values, Key:="L1"
  
    ' Dictionnaire pour gérer les fichiers ouverts
    Set fileHandles = CreateObject("Scripting.Dictionary")
  
    ' Boucle Lire le fichier ligne par ligne
    Do While Not myFile.AtEndOfStream
        Values = myFile.ReadLine
        ID = Split(Values, ";")(0)
      
        ' Vérifier si la date est dans la plage spécifiée
        dateValue = CDate(Split(Values, ";")(7))
        If dateValue >= datedeb And dateValue <= datefin Then
            If Not fileHandles.Exists(ID) Then
                ' Créer le nom du fichier
                fichier = fournisseurs & ID & ".csv"
              
                ' Ouvrir le fichier pour écriture séquentielle et stocker le handle dans le dictionnaire
                fileHandle = FreeFile
                Open fichier For Append As #fileHandle
                fileHandles.Add ID, fileHandle
              
                ' Écrire l'entête
                Print #fileHandle, RubGlobal.Item("L1")
            Else
                ' Récupérer le handle du fichier déjà ouvert
                fileHandle = fileHandles(ID)
            End If
          
            ' Écrire la ligne dans le fichier correspondant
            Print #fileHandle, Values
        End If
    Loop
  
    ' Fermer tous les fichiers ouverts
    For Each fileHandle In fileHandles.Items
        Close #fileHandle
    Next fileHandle
  
    ' Fermer le fichier texte
    myFile.Close
  
    MsgBox "Création des fichiers " & Format(Timer - t, "0.00 \sec")
End Sub
 
Dernière édition:

laurent950

XLDnaute Barbatruc
Bonsoir laurent950,

Que voulez-vous que je vous dise ?

Téléchargez le dossier déposé sur cjoint au post #58 et lancez la macro en cliquant sur le bouton.

A+
C'est exactement ce que j'ai fais
Puis j'ai eu ce message que j'ai posté en posté #84

Erreur d'exécution '14':
Espace de chaîne insuffisant

L'erreur d'exécution '14' avec le message "Espace de chaîne insuffisant" en VBA (Visual Basic for Applications) dans Excel indique que le programme essaie de manipuler ou de stocker une chaîne de texte qui dépasse la limite de mémoire allouée pour les chaînes.
 

oguruma

XLDnaute Occasionnel
C'est exactement ce que j'ai fais
Puis j'ai eu ce message que j'ai posté en posté #84

Erreur d'exécution '14':
Espace de chaîne insuffisant

L'erreur d'exécution '14' avec le message "Espace de chaîne insuffisant" en VBA (Visual Basic for Applications) dans Excel indique que le programme essaie de manipuler ou de stocker une chaîne de texte qui dépasse la limite de mémoire allouée pour les chaînes.
Re.... je martèle depuis le début : "abandonnez VBA" :) les perfs sont peut-être au-dessus en VAB, mais vous vous embarquez dans une galère de maintenance et vos commentaires le montrent parfaitement.
Déjà les assistants de Pwq sont suffisants pour un premier galop... après pour les plus chevronnés comme je l'ai fait on peut aller plus loin de manière progressive sans pousser le code M comme je l'ai fait.
Le seul VBA possible serait comme aussi il figure dans mon fichier Excel un bouton permettant de lancer la requête (on peut faire aussi clic droit actualiser sur la table)...
CQFD à vous de voir :)
 

job75

XLDnaute Barbatruc
Bonjour laurent950, le forum,

La bonne syntaxe pour le tri doit être tri tablo, 1, ub

J'ai mis tri tablo, 1, ub - 1 pour tester quand il y a un renvoi à la ligne en fin de fichier texte.

Le message d'erreur est certainement dû à l'instruction Input(LOF(x), #x) qui concatène les lignes.

Pour l'éviter on peut construire l'Array tablo ligne par ligne mais ça prendra du temps.

A+
 

laurent950

XLDnaute Barbatruc
Le message d'erreur est certainement dû à l'instruction Input(LOF(x), #x) qui concatène les lignes.
Bonjour @job75

Votre code en Poste #58 ne génére aucune erreur à condition d'avoir un ordinateur plus performant en capacité mémoire.
Il est d'ailleurs ultra rapide et vous pouvez encore améliorer la performance de vôtre code.
Avec les tris quickshort dont PatrickToulon à répertorié dans les ressources (j'ai pas testé encore)
Si vous avez envie d essayer pour gagner encore en temps mais l'objectif est déjà atteint est de loin avec les temps si dessous 🙂

Ordinateur avec grosse capacité mémoire = @job75 Poste #58
Votre code = 25.65 secondes

Ordinateur avec faibles capacités mémoire = Poste #84
Mon code = 31.31 secondes


En un mot félicitation @job75 votre code est vraiment très efficace et vraiment bien pensé 🙂🙂

Laurent
 

job75

XLDnaute Barbatruc
Cette histoire d'espace de chaîne insuffisant m'agace, essayez avec :
VB:
    txt = Input$(LOF(x), #x)
    tablo = Split(txt, vbCrLf)
Avec les fichiers joints la variable txt contient 298 000 403 caractères.
 

Discussions similaires

Réponses
6
Affichages
435

Statistiques des forums

Discussions
314 013
Messages
2 104 551
Membres
109 078
dernier inscrit
Nikitoklass