IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Comment traiter un très gros fichier CSV


Sujet :

WinDev

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Comment traiter un très gros fichier CSV
    Bonjour,

    J'ai besoin d'extraire des données de très gros fichiers SCV (de 3 à 5go) pour les injecter dans des fichier HF.
    La fonction FOuvre ne semble pas fonctionner et je suppose que c'est à cause de la taille du fichier car si je test avec un fichier plus petit, ça fonctionne.

    Je pensais utiliser FDécoupe mais ça ne marche pas non plus car la coupe se fait à n'importe quel endroit du fichier et pas forcément en fin de ligne. Du coup, je ne peux pas gérer les données correctement.

    Avez vous un moyen ou une astuce pour ce genre de cas svp ?

    Merci de votre aide
    Les solutions les plus simples sont les plus efficaces

  2. #2
    Membre émérite
    Femme Profil pro
    .
    Inscrit en
    Janvier 2012
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : .
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 999
    Points : 2 525
    Points
    2 525
    Par défaut
    En le transformant en XLSx, non ?
    Avec les fonctions excel qui vont bien.

  3. #3
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Bonjours,
    HImporteTexte peut être ?
    fChargeTexte risque peut être d'avoir le même effet que fOuvre, mais c'est à tenter aussi...
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Il y avait une limite des systèmes d'exploitation, ils étaient incapables de traiter les fichiers de plus de 2Go. A priori le pointeur qui dit 'on va lire x octets à partir de telle adresse) ne pouvait pas dépasser 2Go.

    Que dit la fonction ErreurInfo(ErrMessage) ?


    Arrives-tu à ouvrir ce fichier avec d'autres outils ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    Bonjours,
    HImporteTexte peut être ?
    fChargeTexte risque peut être d'avoir le même effet que fOuvre, mais c'est à tenter aussi...
    Bonjour,

    je me souviens que fchargetexte était limité à 2 Go. est-ce toujours le cas ? Si tu fais un projet en 64 bits ?

    Pour le fdecoupe, c'est une bonne idée. Tu pourras utiliser le fchargetexte et trouver "la dernière ligne", c'est-à-dire celle qui n'a pas de RC et coller avec la première ligne du fichier suivant...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Bonjour,

    Pour le fOuvre(), tu as utilisé quoi comme option ?

    Je vois qu'il y a foAccèsSéquentiel, peut-être que ça évite d'avoir à charger le fichier... Je n'ai fait aucun essai mais ça me paraîtrait logique.
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  7. #7
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par philouZ Voir le message
    Je n'ai fait aucun essai
    D'autant plus qu'un fichier de cette taille il faut le trouver. Ce qui s'en rapproche le plus c'est le fichier FANTOIR (avec AN) nationnal
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Merci Voroltinquo, je ne connaissais pas ce fichier.

    Du coup j'ai fait un essai et le fichier est ouvert en une fraction de seconde avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fOuvre(frepexe()+"\FANTOIR0120", foLecture+foAccèsSéquentiel)
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  9. #9
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    je ne connaissais pas ce fichier
    Quand on n'a jamais eu à traiter des problèmes de cadastre ou assimilé, c'est logique ...
    Le problème c'est qu'il ne fait que frôler le Go (je vais tenter le coup avec 5 ou 6 bout à bout)
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Citation Envoyé par philouZ Voir le message

    Du coup j'ai fait un essai et le fichier est ouvert en une fraction de seconde
    Le temps d'ouverture n'est pas lié à la taille du fichier. L'ouverture déclare un handle sur le fichier, rien d'autre. La lecture se fera par les fonctions fLit() ou fLitLigne() ensuite.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    Tu pourras utiliser le fchargetexte et trouver "la dernière ligne"
    Le problème, c'est d'avoir la mémoire qui suit. Avec ma cacahuète (8 Go mais d'autres appli qui tournent,) au mieux j'ai le message 'Mémoire insuffisante", j'ai même eu droit à un reboot sauvage.
    Une solution serait peut être dans ce cas d'utiliser l'option Taille et de trouver la dernière ligne comme tu le suggérais
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  12. #12
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    C'est pour cela que je parlais de découper le fichier avant avec le fdecoupe(). Si tu fais des tronçon de 100 Mo (c'est déjà pas mal je pense), tu peux utiliser le fchargetexte().

    L'intérêt du fchargetexte() est de limiter le nombre d'accès en lecture. Une lecture de 1000 lignes est plus rapide que 1000 lectures d'une ligne. C'est peut-être moins vrai aujourd'hui (machines plus performantes), mais vu la taille du fichier initiale, je pense que ça peut être une bonne idée.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  13. #13
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Le temps d'ouverture n'est pas lié à la taille du fichier. L'ouverture déclare un handle sur le fichier, rien d'autre. La lecture se fera par les fonctions fLit() ou fLitLigne() ensuite.
    Soit mais il parle bien de fOuvre()

    Perso après la lecture de 863 000 lignes, la RAM est à 4 Mo et il n'ya que le processeur qui tourne. D'un autre côté ça me paraît logique étant donné qu'on ne fait que lire ligne par ligne et que la seule chose qui est chargée en mémoire reste la ligne en cours. On ne charge pas tout le fichier. Donc je ne vois vraiment pas où est le problème au final.
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  14. #14
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    L'alternative , c'est de passer par des fLit() en lisant à chaque fois 4 ou 5 Mo par exemple.
    Tu lis 4 Mo, tu te retrouves avec une chaine de 4Mo.
    Tu boucles "Pour toute chaine sch de sch0 séparée par RC"

    Tu ne traites pas la dernière ligne parce qu'elle est très probablement incomplète et tu recommences en lisant à nouveau 4 ou 5 Mo.
    Et en se débrouillant pour bien lire la ligne oubliée dans le traitement précédent !
    Ou concatener le nouveau bloc lu avec la portion de ligne en suspens.

    Si tu as besoin que le traitement aille vite, ça vaut le coup de passer du temps à développer cette mécanique.

    Mais pour tout ça, il faut que le fOuvre() fonctionne !
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  15. #15
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    En passant par un buffer ça devrait passer, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    sCheminFichier est une chaîne
    bufContenuLu est Buffer
    nTailleLue est entier
    nTaillelecture est entier
    nPositionEnCours est entier
    cDernierCaractèreLu est un caractère
    nPositionDernierCR est entier
    bufContenuTravail est Buffer
     
    nValJauge est un entier
    nJaugeMax est un entier
     
    sCheminFichier=fSélecteur("", "", "Sélectionnez un fichier.....", "fichier csv" + TAB + "*.csv", "*.csv", fselOuvre)
    nJaugeMax=fTaille(sCheminFichier)
     
    nTaillelecture=10000
    nTailleLue=nTaillelecture
    TANTQUE (nTailleLue=10000) ET (cDernierCaractèreLu<>EOT) //Le coup de pas de chance, la taille du fichier est un multiple de la taille de lecture
    	bufContenuLu=fChargeBuffer(sCheminFichier,nPositionEnCours,nTaillelecture)
    	nTailleLue=Taille(bufContenuLu)
    	nValJauge=nValJauge+nTailleLue
    	Jauge(nValJauge,nJaugeMax)
    	cDernierCaractèreLu=bufContenuLu[nTailleLue]
    	SI cDernierCaractèreLu<>EOT ALORS
    		nPositionDernierCR=Position(bufContenuLu,CR,0,DepuisFin) //à vérifier pour le CR, certains csv utilisent LF et d'autres CRLF
    		bufContenuTravail=Gauche(bufContenuLu,nPositionDernierCR) //Vérifier le + ou -1
    		nPositionEnCours=nPositionEnCours+Taille(bufContenuTravail) //On crée la prochaine position de lecture
    	SINON   //On arrive à la fin
    		bufContenuTravail=bufContenuLu
    	FIN
    	//Traitement du buffer
    FIN
    Avec une petite cacahuète (4GO) et en 32bits, pas de pb mémoire pour la lecture
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  16. #16
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonne idée le coup du buffer, ça fait le découpage virtuellement.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  17. #17
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    ça fait le découpage virtuellement.
    On a surtout la possibilité de choisir l'endroit du début de la lecture, contrairement à fDécoupe.
    Çà évite d'avoir à traiter les "bouts de ligne".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Je recupère ma fin de ligne
    je traite mon fichier découpé
    Je lit le fichier suivant
    je récupère mon début de ligne
    Je traite ma ligne orpheline
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  18. #18
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Oui. En plus il n'y a pas l'écriture de tous les morceaux de fichiers.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  19. #19
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut
    Bonjour,

    Tout d'abord, désolé d'avoir lancé cette discussion sans l'avoir suffisamment suivie.
    Merci de toutes les infos et réactions.

    J'ai avancé :
    - Le FOuvre ne pose pas de problème en fait. A priori, je confirme (merci Lo²) que le FOuvre ne charge pas le fichier, il ne fait que ouvrir l'accès.
    - Mon soucis venait du FLitLigne que je faisais ensuite car mon fichier utilise la "LF" comme séparateur de ligne. Et faute de l'avoir indiqué dans mon dans ma fonction FLitLigne (merci Lo²), c'est tout le fichier qui était lu. "LF" = ASCII 10
    - Donc, à se stade, ça progresse.
    - Sauf que quand je lance le traitement, la récupération des données se fait sur environ 1 000 000 de lignes en gros (c'est variable) et bim, Windev plante. "Windev à cesser de fonctionner"

    Donc je suis pas loin du but mais il y a un truc qui merde.
    Je vais tester la lecture des lignes sans l'écriture dans les fichiers HF pour essayer de savoir quelle opération pose problème.
    Les solutions les plus simples sont les plus efficaces

  20. #20
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut
    Je viens de lancer un test avec lecture des lignes du fichier mais aucune écriture dans le fichier de donnée HF.

    Pas de bug donc :
    - Le FOuvre gère parfaitement les gros fichiers
    - Ma boucle et mon FLitLigne fonctionnent bien

    Le problème vient de l'écriture
    Les solutions les plus simples sont les plus efficaces

Discussions similaires

  1. Traiter un très gros fichier XML
    Par nicotibo dans le forum Android
    Réponses: 8
    Dernier message: 11/06/2016, 18h35
  2. Réponses: 16
    Dernier message: 03/05/2012, 14h22
  3. Très gros fichier CSV
    Par kidathom dans le forum Débuter
    Réponses: 6
    Dernier message: 29/04/2008, 13h00
  4. [CSV] Traitement d'un très gros fichier XML ou CSV
    Par Paulux1 dans le forum Langage
    Réponses: 3
    Dernier message: 25/03/2008, 16h05
  5. Transformer un très gros fichier XML avec XSL
    Par wozzz dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 30/05/2006, 10h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo