Lire dans un fichier CSV de 170Mo avec Access

Résolu
mmmxtina
Messages postés
67
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
9 avril 2013
- 6 juil. 2009 à 10:30
mmmxtina
Messages postés
67
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
9 avril 2013
- 15 juil. 2009 à 11:34
Bonjour à tous!!

J'ai un petit soucis, j'ai besoin de récupérer des données de plusieurs fichier CSV dans ma base de données access. Le truc c'est que ces fichiers sont très lours, don 1 qui fais exctement 173Mo (je sais mm pas il comporte de ligne, mais en tout cas Excel ne peut pas l'ouvrir!)
 Donc le problème c'est que quand je lance mon appli pour lire le fichier elle plante! (enfin jje la lance le matin à 10h, à 17h ça n'a toujours pas finis de tourner, donc je suppose qu'elle à planter, non??
Donc je me demandais si c'étais possible de découper le fichiercsv, ou de lme lire en partie et de reprendre la lecture une heure plustard, enfin de faire en sorte que ça ne plante pas!
voici mon code (mon code fonctionne sur des fichier de 5Mo, mais je pense qu'il est pas assez performant pour  175Mo) :
<hr />
Set myFSO = CreateObject("Scripting.FileSystemObject")
    RecupNomFich TabTypeFichiers(2), TabTypeInterv(5)

    Set csvFile = myFSO.OpenTextFile(cheminCSV & fichierCSV)  'c'est des variables globales
    
    'tant qu'on est pas à la fin du fichier CSV (boucle sur chaque ligne)
    While Not csvFile.AtEndOfStream
         'lire la ligne suivante
        csvLine = csvFile.ReadLine
           '"spliter" la ligne
           tabStr = Split(csvLine, csvDelimiter)
              'actions sur le fichier
    Wend
    csvFile.Close
    Set csvFile Nothing: Set myFSO Nothing
<hr />
Merci beaucoup à tous!!

12 réponses

mmmxtina
Messages postés
67
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
9 avril 2013

10 juil. 2009 à 13:52
en fait fallai déclarer Dim ligne As Long, et pas Dim  Ligne As Integer, pour ce que ça interresse!
3
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
6 juil. 2009 à 10:43
Salut
La structure de lecture semble bonne.

Règle 1 :
Toujours ajouter un DoEvents dans les boucles, sinon, tu ne pourras pas reprendre la main ni le stopper

Règle 2 :
FSO est pratique, mais lent.
VBA a sa propre commande Open, Line Input, Close

Règle 3 :
Faire les essais sur un fichier de taille raisonnable
+ utiliser le debuggueur dans le code pour suivre l'évolution du programme :
F9 : désigne la ligne sur laquelle tu veux te figer
F8 : Exécute la prochaine ligne de code (une seule ligne)
F5 : Exécute le reste du programme normalement
Quand tu es arrêté sur une ligne dans le code, survole tes variables avec la souris pour qu'il t'affiche leur contenu
Ca te permettra de vérifier l'avancement de ton code et de découvrir où ça coince
Eventuellement, ajoute un 
   Debug.Print csvLine
après ton ReadLine pour suivre l'avancement dans la fenêtre de débug (Ctrl-G)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
6 juil. 2009 à 11:28
gaffe, Jack, Line Input à éviter pour de gros fichiers.

VB va chercher les fins de ligne et générer un bon paquet d'accès disque.
faut lire le ficheir par bloc de quelques Ko
et jouer ainsi avec un Buffer roulant...
0
mmmxtina
Messages postés
67
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
9 avril 2013

6 juil. 2009 à 11:55
Merci pour vos réponses!
bah là j'ai essayé avec un fichier de 5Mo pour l'instant ça à l'air de fonctionner, j'ai arreter le debbuger car je voulais pas attendre une heure sans rien faire!
J'ai oublier de mette Debug.Print csvLine dailleurs, je vais retester avec ça.
A ton avis Reinfield comment je peu faire avec ce gros fichier?
je pensait à le découper en morceau, mais ça doit être galère, ou bien lire par paquet de 5000lignes, qu'en pense tu? merci.

En passant, j'ai un autre petit soucis, est-ceque vous l'avez déjà eu:

J'insère dans ma base de données, les onformations des fichiers csv, et dans ces infos il ya des dates que j'insère comme ceci dans mes tables

insert into ...  '#' & laDate & '#' ...
ça fonctionne très bien, mais pour certaine date, je ne sais pas pourquoi access, inverse la date du jour et la date du mois, donc le 01/04/2008 devient le 04/01/2008, et donc ça fausse mes requêtes du coup.
c'est vraiment bizarre, dans le fichier csv ya bien 01/04/2008 et dans acces je retrouve 04/01/2008, et pas pour tous els intervenants, seulement qqun.

une idée? merci!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
6 juil. 2009 à 12:01
formate les dates ainsi :
yyyy-mm-dd
0
mmmxtina
Messages postés
67
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
9 avril 2013

6 juil. 2009 à 12:26
ça marche niquel!!!
merci!
0
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
6 juil. 2009 à 13:11
maChaine = "insert into ...  #" & laDate & "# ..."



Le symbole # n'est pas un caractère qu'on rajoute à la chaine, mais un vrai délimiteur SQL.
Il ne faut donc pas l'encadrer par des ' qui délimite les chaines sous SQL.
De plus, si laDate est une variable dont le contenu est dans VB, il faut ressortir de la chaine (avec les " de VB)
0
mmmxtina
Messages postés
67
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
9 avril 2013

6 juil. 2009 à 14:31
oui tu as raison jack, dans mon apli je l'ai écris avec ", c'etait pour donner l'exemple, j'ai aps fais gafe j'ai écris '#', au lieu de "#". et ça fonctionne très bien!!
0
mmmxtina
Messages postés
67
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
9 avril 2013

9 juil. 2009 à 17:44
bonjour à tous!!!

bon suite à mon problème de temps avec mon fameux fichier csv de 170mo, j'ai eu (la bonne) idée d'exporter directement mon fichier dans une autre base de données access, il semblerai que les accès à une autre base de données access soit plus rapide que els accès à un fichier csv (je me trompe,)
en plus ce qui est pratique, c'est que je peux chercher plus précisément ce que je veux, pour insérer les informations dans ma 1e base.

donc petit soucis, la table de ma 2e page (celle qui contient le fichier de 170mo) fais 1 800 000 lignes comme le fichier, et en fait pour récupérer els infos de cette base dans ma base 1, je fais une requete où je demande de sélectionné certaine colonne de cette selon certain critère, et afin de récupérer els données ligne par ligne, j'ai mis un compteur (c'est un integer) appellé ligne.

Le soucis c'est que a environ 35000 lignes (le compteur = 35000) le compteur déclenche une erreur de type 6 "Dépassement de capacité"!
Comment y remédier, une idée? merci beaucoup!!!

j'utilise mon compteur comme ceci :

Code :
ligne =ligne +1

ce compteur est dans une boucle.
et c'est sur cette ligne que access se stoppe.
0
Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
10 juil. 2009 à 14:06
Integer -> 32768 maxi

de toutes facon, mieux vaux toujours utiliser des Longs, adressables plus facilement sur nos machines 32bits
0
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
12 juil. 2009 à 03:38
Si tu n'as pas déclencher d'erreur lorsque l'entier est arrivé à saturation, c'est que tu devais avoir un affreux "On Error Resume Next" en tête.
A n'utiliser QUE lorsque tu désires gérer toi même les erreurs, par exemple quand tu penses que l'instruction qui suit risque de déclencher une erreur ET que, à la ligne suivante, tu testes Err.Number pour décider quelque chose.
Masquer les erreurs peut entrainer des heures et des heures de recherche de bug.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
mmmxtina
Messages postés
67
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
9 avril 2013

15 juil. 2009 à 11:34
Bonjour à tous!!!
Merci de vos nombreuses réponses, et en effet jack j'ai un affreux "On Error Resume Next", j'avou que j'ai récupéré le code sur internet, et vu que ça fonctionnai bien j'ai aps fait attention à cette ligne de code qui apparement n'est pas conseillée. bon maintenant que j'ai déclaré ligne en Long tout va bien cependant.

Bon je profite de vos nombreuses connaissances pour vous poser d'autres question sur Access, peut-être que vous pourrez m'aider!

1_ Je souhaiterai créer un bouton qui me propose de sauvegarder ma base de donnée en état ouvert, (c'est-à-dire qu'elle n'enregistrera pas les dernières modifications), et lui indiquée où je veus l'enregistrer et préciser son nom.
Car j'ai vu sur internet qu'il fallait faire DoCmd.Save, mais il me semble que ça enregistre la base de données ouverte au mm endroit et c'est tout.

2_ Comment gérer els erreurs sous access, c'est-à-dire au lieu qu'il y ai la pop up qui propose de débugger, créer une pop up qui dise à l'utilisateur qu'il y a tel soucis.
(jack si tu pouvais être plus précis sur ton message? merci)




Merci à tous!
jespere avoir été claire.
0