Il me semble avoir déjà été confronté à ce genre de problème.
De mémoire, j'avais contourné le problème en utilisant fChargeBuffer qui permet de "découper" le fichier via les paramètres début/fin.
Attention toutefois aux derniers octets, (ceux situés après le dernier séparateur de ligne) qu'il va falloir supprimer du buffer et récupérer pour la prochaine lecture
-
Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !Rejeter la notice
WD Chargement d'un gros fichier texte dans hyperfile
Discussion dans 'Windev' créé par Kill3rbko, Fev 25, 2023.
Gemini1961
Well-Known Member
MEMBRE WX
DUMP TEAM
Bonjour
Effectivement fractionner le fichier me semble une bonne solution, c'est d'ailleurs la méthode que j'ai adopté lorsque j'ai été confronté à un problème identique;
Attention aussi au caractère blanc insécable, lui aussi m'a posé quelques soucis ;-)
Bien cordialement
Kill3rbko apprécie ceci.
Excellente idée, je crois commencer à voir le bout du tunnel avec la fonction fdécoupe.
Par contre fdécoupe "découpe" le fichier en fonction de la taille et du coup mes différent fichiers se retrouvent avec la ligne de début et de fin tronquée d'un fichier à l'autre.
Gemini1961
Well-Known Member
MEMBRE WX
DUMP TEAM
Chaque ligne du fichier représente t'elle un enregistrement ou est-ce un fichier binaire ?
Gemini1961
Well-Known Member
MEMBRE WX
DUMP TEAM
Un solution consiste à garder l'enregistrement tronqué ( de ne pas le traiter) et l'ajouter en début de la découpe suivante ( afin de le traiter quand il est complet )
;-)
Chaque ligne represente juste un email et mot de passe du genre :
et oui chaque ligne est un enregistrement dans mon fichier HFCode (Text):annyvdeynde@hotmail.com:teigertje
lesly__30@hotmail.com:doguito
zulicharun@hotmail.com:19921102h
yakuberol02@hotmail.com:yakups02
mertkeles28@hotmail.com:123456
bir_fizikci@hotmail.com:6546031
haley_nicole_c@hotmail.com:destiney7
gfdgsfds@hotmail.com:1234
isimsizbumsnxx@hotmail.com:123456123456
golden75boy@hotmail.com:1321
Mon souci est que je n'arrive pas à lancer plusieurs lectures des differents fichiers dans les threads.
Au lieu de fdécoupe, j'envisageais plutôt l'utilisation de fChargeBuffer qui est un peu plus souple
un truc du style :
Code (Windev):saCheminFichier est chaîne
bufTravail est Buffer
nOffset est entier //Début de la lecture
nTaillePartielles est entier //Taille des données entre le dernier CRLF et la fin de la lecture
nTailleBuffer est entier //Taille à lire
tabDonnées est tableau de chaînes //Données à exploiter
tabTemp est tableau de chaînes //Données lues dans la boucle
nNoPassage est entier
nTailleBuffer = 25000
bufTravail =Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(saCheminFichier,0,nTailleBuffer)
TANTQUEBonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(bufTravail,CRLF,0,DepuisFin)<>0
nNoPassage++
//On récupère les données exploitables
bufTravail=bufTravail[[ ÀBonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(bufTravail,CRLF,0,DepuisFin)]]
nTaillePartielles=nTailleBuffer-Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(bufTravail)-1
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(bufTravail,tabTemp,CRLF)
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(tabDonnées,tabTemp)
//On calcule la position des données "partielles"
nOffset=nNoPassage*nTailleBuffer-nTaillePartielles
bufTravail=Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(saCheminFichier,nOffset,nTailleBuffer)
FIN
Gemini1961 et Kill3rbko aiment ça.
Ouh là Dandy!!!!
merci énormément pour le code.
Je regarde tout de suite
Bon apparemment j'ai toujours ce souci mémoire dès qu'on fait le tableauajoute du tableau temp même en diminuant 10x la taille du buffer.
Code (Text):Error at line 80 of Clic sur BTN_Select6 process.
ArrayAdd function called.
Insufficient memory.
If you handle large amounts of data, consider switching the application to 64 bits.
Gemini1961
Well-Known Member
MEMBRE WX
DUMP TEAM
je ne pense pas que ce soit la taille du buffer qui pose problème mais bien la taille du tableau.
A quel indice de tableau (nNoPassage) se plante le tableau ?
Sans quoi peut-être envisager de travailler avec plusieurs tableaux,
le changement de tableau se ferait en fonction de l'indice ( nNoPassage)
Compiles-tu en 32 ou 64 bits ? En 32 bits, on a le plafond des 2Go.
WX1331 et Gemini1961 aiment ça.
Compiles-tu en 32 ou 64 bits ? En 32 bits, on a le plafond des 2Go.Cliquez pour agrandir...
Je vais maintenant regarder du côté de l'enregistrement en hyperfile à moins que l'appétit venant en mangeant il ne soit même plus necessaire?
Je m'explique : A l'origine après avoir chargé ce gros fichier texte, mon objectif est d'y rechercher une liste d'utilisateur (20000 au plus), la recherche par requête sql me semblait la plus rapide, mais peut être que les fonctions tableau pourrait le faire?
mais cela est une autre histoire!
Merci beaucoup
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
etBonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Dandypunk et Gemini1961 aiment ça.
En ce qui concerne les chaînes, TableauCherche recherche la totalité d'une chaîne. On peut toutefois se bricoler une fonction TableauContient
UtilisationCode (Windev):FONCTION TableauContient(LOCAL tabNomTableau est tableau de chaînes,LOCAL saValeurCherchée est chaîne,LOCAL nIndDébutRecherche est entier=1):entier
nNoLigne est un entier
POUR nNoLigne=nIndDébutRecherche _À_ tabNomTableau..Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
SIBonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(tabNomTableau[nNoLigne],saValeurCherchée) ALORS
RENVOYER nNoLigne
FIN
FIN
RENVOYER -1
Code (Windev):
WX1331, Gemini1961 et Kill3rbko aiment ça.
En ce qui concerne les chaînes, TableauCherche recherche la totalité d'une chaîne. On peut toutefois se bricoler une fonction TableauContient
[/code]Cliquez pour agrandir...
Gemini1961
Well-Known Member
MEMBRE WX
DUMP TEAM
Une petite variante sur la même base ;-)
FONCTION Tableau_Contient( LOCAL p_oTableauDeChaines est tableau de chaînes ...
, LOCAL p_sValeurRecherchee est chaîne ...
, LOCAL p_IndiceDepartRech est entier = 1) <sans PAS À PAS> : entier
LOCAL
iTableauOccurr est un entier = p_oTableauDeChaines..Occurrence
iTableauIndice est un entier = -1
SI iTableauOccurr <= p_IndiceDepartRech ALORS
POUR iTableauIndice = p_IndiceDepartRech _À_ iTableauOccurr
SI Contient(p_oTableauDeChaines[iTableauIndice], p_sValeurRecherchee) ALORS
iTableauIndice = iTableauIndice
SORTIR
FIN
FIN
FIN
RENVOYER (iTableauIndice)
Bien cordialement