Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Chargement fichier CSV

8 réponses
Avatar
Twitzig
Un de mes développement contient une option de chargement d'un fichier CSV au
format ci-dessous:

004380N;002;00;001;0;LV;88,5
004380N;006;00;001;0;BU;26,9
004380N;012;00;001;0;SS;873,1
005150S;004;00;001;0;HM;109,7
005150S;006;00;001;0;HM;106,0
005150S;012;00;005;0;HM;6,5

Avec la totalité des fichiers traités à ce jour, tout se passe bien.
Par contre, avec celui ci-dessus, le premier champ de la première ligne est
considéré comme nul (alors que le second est bien vu comme égal à 2)
Si je supprime les 2 premières lignes, la suite se passe bien pour quelques
lignes, puis le pb se reproduit.

J'ai vérifié avec un éditeur hexa qu'il n'y avait pas de caractères cachés
dans le fichier.....

Quelqu'un aurait il une idée?

8 réponses

Avatar
Aski
Salutatoi Twitzig,

Tu as donc déclaré :

Un de mes développement contient une option de chargement d'un
fichier CSV au format ci-dessous:

004380N;002;00;001;0;LV;88,5
004380N;006;00;001;0;BU;26,9
004380N;012;00;001;0;SS;873,1
005150S;004;00;001;0;HM;109,7
005150S;006;00;001;0;HM;106,0
005150S;012;00;005;0;HM;6,5

Avec la totalité des fichiers traités à ce jour, tout se passe bien.
Par contre, avec celui ci-dessus, le premier champ de la première
ligne est considéré comme nul (alors que le second est bien vu comme
égal à 2)
Si je supprime les 2 premières lignes, la suite se passe bien pour
quelques lignes, puis le pb se reproduit.

J'ai vérifié avec un éditeur hexa qu'il n'y avait pas de caractères
cachés dans le fichier.....

Quelqu'un aurait il une idée?



Ce serait plus facile à déboguer avec un extrait de ton code (décodage des
lignes)

--
Cordialement

Aski

AntiSpamEdit - Version 1.6.4 du 12/08/05
Aide de K9 en français
http://h.charlier.de.chily.perso.cegetel.net/
ou
http://h.dechily.free.fr/
Avatar
Twitzig
Voilà l'extrait de code

Private Sub fnRepencours()
' Fonction mise à jour "repérage en cours" (intégration plans AREP)
Dim bdd As Database
Dim bddtxt As Database
Dim qdftxt As QueryDef
Dim rstlinked As Recordset
Dim rstsuivi As Recordset
Dim ch_sql As String
Dim UT_en_cours As String
Dim UT_precedent As String
Dim Date_jour As String
Dim chaine As String
Dim fic_ouvrir As String
Dim rep_ouvrir As String
Dim ficlong As Integer
Dim chainelong As Integer
Dim replong As Integer
Dim inttemp As Integer
Dim bat_en_cours As Integer
Dim bat_precedent As Integer
Dim bat_trouve As Integer
Dim nouveau As Integer
' Paramétrage du contrôle OPEN
cdlopen.Filter = "Listes des plans AREP (*.txt)|*.txt"
cdlopen.DialogTitle = "Chargement d'une liste de plans AREP"
cdlopen.FileName = ""
cdlopen.ShowOpen
chaine = cdlopen.FileName
' On vérifie si on doit continuer (si on a choisi un fichier)
If chaine = "" Then
Exit Sub
End If
fic_ouvrir = cdlopen.FileTitle
' Longueur du nom de fichier
ficlong = Len(fic_ouvrir)
' Longueur du nom avec répertoire
chainelong = Len(chaine)
' Longueur du nom de répertoire
replong = chainelong - ficlong
' Récupération du répertoire seul dans la chaine
rep_ouvrir = Left(chaine, (replong - 1))
chemin_base = GetSetting("Rarplus", "parametres", "Base", Default =
"C:Program filesRarplusBase_init.mdb")
Set bdd = OpenDatabase(chemin_base)
' Ouverture fichier Excel comme autre base de données
Set bddtxt = OpenDatabase(rep_ouvrir, False, False, "Text;")
' Acces aux données
' Suppression extension
fic_ouvrir = Left(fic_ouvrir, (ficlong - 4))
ch_sql = "SELECT * FROM [" & fic_ouvrir & "#txt];"
Set qdftxt = bddtxt.CreateQueryDef("", _
ch_sql)
Set rstlinked = qdftxt.OpenRecordset(dbOpenSnapshot)
Set rstsuivi = bdd.OpenRecordset("SuiviAmiante")
' RAZ table mémo MAJ
bdd.Execute ("DELETE * FROM liste_maj;")
' Traitement des données
With rstlinked
.MoveFirst
' Lecture fichier
Do While Not .EOF
nouveau = 0
UT_en_cours = .Fields(0)=====> considéré comme nul
bat_en_cours = .Fields(1)=====> bien reconnu

"Aski" a écrit :

Salutatoi Twitzig,

Tu as donc déclaré :

> Un de mes développement contient une option de chargement d'un
> fichier CSV au format ci-dessous:
>
> 004380N;002;00;001;0;LV;88,5
> 004380N;006;00;001;0;BU;26,9
> 004380N;012;00;001;0;SS;873,1
> 005150S;004;00;001;0;HM;109,7
> 005150S;006;00;001;0;HM;106,0
> 005150S;012;00;005;0;HM;6,5
>
> Avec la totalité des fichiers traités à ce jour, tout se passe bien.
> Par contre, avec celui ci-dessus, le premier champ de la première
> ligne est considéré comme nul (alors que le second est bien vu comme
> égal à 2)
> Si je supprime les 2 premières lignes, la suite se passe bien pour
> quelques lignes, puis le pb se reproduit.
>
> J'ai vérifié avec un éditeur hexa qu'il n'y avait pas de caractères
> cachés dans le fichier.....
>
> Quelqu'un aurait il une idée?

Ce serait plus facile à déboguer avec un extrait de ton code (décodage des
lignes)

--
Cordialement

Aski

AntiSpamEdit - Version 1.6.4 du 12/08/05
Aide de K9 en français
http://h.charlier.de.chily.perso.cegetel.net/
ou
http://h.dechily.free.fr/





Avatar
Aski
Salutatoi Twitzig,

Désolé, mais je ne travaille pas avec les RecordSet.
J'aurais utilisé :
- Line Input pour lire chaque ligne
- InStr pour déterminer la^position des ';'
- Mid$() pour extraire les champs.

Peut-être d'autres, familiarisés avec les interrogations de BD, pourront
t'aider

Aski

Tu as donc déclaré :

Voilà l'extrait de code

Private Sub fnRepencours()
' Fonction mise à jour "repérage en cours" (intégration plans
AREP) Dim bdd As Database
Dim bddtxt As Database
Dim qdftxt As QueryDef
Dim rstlinked As Recordset
Dim rstsuivi As Recordset
Dim ch_sql As String
Dim UT_en_cours As String
Dim UT_precedent As String
Dim Date_jour As String
Dim chaine As String
Dim fic_ouvrir As String
Dim rep_ouvrir As String
Dim ficlong As Integer
Dim chainelong As Integer
Dim replong As Integer
Dim inttemp As Integer
Dim bat_en_cours As Integer
Dim bat_precedent As Integer
Dim bat_trouve As Integer
Dim nouveau As Integer
' Paramétrage du contrôle OPEN
cdlopen.Filter = "Listes des plans AREP (*.txt)|*.txt"
cdlopen.DialogTitle = "Chargement d'une liste de plans AREP"
cdlopen.FileName = ""
cdlopen.ShowOpen
chaine = cdlopen.FileName
' On vérifie si on doit continuer (si on a choisi un fichier)
If chaine = "" Then
Exit Sub
End If
fic_ouvrir = cdlopen.FileTitle
' Longueur du nom de fichier
ficlong = Len(fic_ouvrir)
' Longueur du nom avec répertoire
chainelong = Len(chaine)
' Longueur du nom de répertoire
replong = chainelong - ficlong
' Récupération du répertoire seul dans la chaine
rep_ouvrir = Left(chaine, (replong - 1))
chemin_base = GetSetting("Rarplus", "parametres", "Base", Default > "C:Program filesRarplusBase_init.mdb")
Set bdd = OpenDatabase(chemin_base)
' Ouverture fichier Excel comme autre base de données
Set bddtxt = OpenDatabase(rep_ouvrir, False, False, "Text;")
' Acces aux données
' Suppression extension
fic_ouvrir = Left(fic_ouvrir, (ficlong - 4))
ch_sql = "SELECT * FROM [" & fic_ouvrir & "#txt];"
Set qdftxt = bddtxt.CreateQueryDef("", _
ch_sql)
Set rstlinked = qdftxt.OpenRecordset(dbOpenSnapshot)
Set rstsuivi = bdd.OpenRecordset("SuiviAmiante")
' RAZ table mémo MAJ
bdd.Execute ("DELETE * FROM liste_maj;")
' Traitement des données
With rstlinked
.MoveFirst
' Lecture fichier
Do While Not .EOF
nouveau = 0
UT_en_cours = .Fields(0)=====> considéré comme nul
bat_en_cours = .Fields(1)=====> bien reconnu

"Aski" a écrit :

Salutatoi Twitzig,

Tu as donc déclaré :

Un de mes développement contient une option de chargement d'un
fichier CSV au format ci-dessous:

004380N;002;00;001;0;LV;88,5
004380N;006;00;001;0;BU;26,9
004380N;012;00;001;0;SS;873,1
005150S;004;00;001;0;HM;109,7
005150S;006;00;001;0;HM;106,0
005150S;012;00;005;0;HM;6,5

Avec la totalité des fichiers traités à ce jour, tout se passe bien.
Par contre, avec celui ci-dessus, le premier champ de la première
ligne est considéré comme nul (alors que le second est bien vu comme
égal à 2)
Si je supprime les 2 premières lignes, la suite se passe bien pour
quelques lignes, puis le pb se reproduit.

J'ai vérifié avec un éditeur hexa qu'il n'y avait pas de caractères
cachés dans le fichier.....

Quelqu'un aurait il une idée?



Ce serait plus facile à déboguer avec un extrait de ton code
(décodage des lignes)

--
Cordialement

Aski

AntiSpamEdit - Version 1.6.4 du 12/08/05
Aide de K9 en français
http://h.charlier.de.chily.perso.cegetel.net/
ou
http://h.dechily.free.fr/




Avatar
Twitzig
ok, donc si quelqu'un a d'autres idées

"Aski" a écrit :

Salutatoi Twitzig,

Désolé, mais je ne travaille pas avec les RecordSet.
J'aurais utilisé :
- Line Input pour lire chaque ligne
- InStr pour déterminer la^position des ';'
- Mid$() pour extraire les champs.

Peut-être d'autres, familiarisés avec les interrogations de BD, pourront
t'aider

Aski

Tu as donc déclaré :

> Voilà l'extrait de code
>
> Private Sub fnRepencours()
> ' Fonction mise à jour "repérage en cours" (intégration plans
> AREP) Dim bdd As Database
> Dim bddtxt As Database
> Dim qdftxt As QueryDef
> Dim rstlinked As Recordset
> Dim rstsuivi As Recordset
> Dim ch_sql As String
> Dim UT_en_cours As String
> Dim UT_precedent As String
> Dim Date_jour As String
> Dim chaine As String
> Dim fic_ouvrir As String
> Dim rep_ouvrir As String
> Dim ficlong As Integer
> Dim chainelong As Integer
> Dim replong As Integer
> Dim inttemp As Integer
> Dim bat_en_cours As Integer
> Dim bat_precedent As Integer
> Dim bat_trouve As Integer
> Dim nouveau As Integer
> ' Paramétrage du contrôle OPEN
> cdlopen.Filter = "Listes des plans AREP (*.txt)|*.txt"
> cdlopen.DialogTitle = "Chargement d'une liste de plans AREP"
> cdlopen.FileName = ""
> cdlopen.ShowOpen
> chaine = cdlopen.FileName
> ' On vérifie si on doit continuer (si on a choisi un fichier)
> If chaine = "" Then
> Exit Sub
> End If
> fic_ouvrir = cdlopen.FileTitle
> ' Longueur du nom de fichier
> ficlong = Len(fic_ouvrir)
> ' Longueur du nom avec répertoire
> chainelong = Len(chaine)
> ' Longueur du nom de répertoire
> replong = chainelong - ficlong
> ' Récupération du répertoire seul dans la chaine
> rep_ouvrir = Left(chaine, (replong - 1))
> chemin_base = GetSetting("Rarplus", "parametres", "Base", Default > > "C:Program filesRarplusBase_init.mdb")
> Set bdd = OpenDatabase(chemin_base)
> ' Ouverture fichier Excel comme autre base de données
> Set bddtxt = OpenDatabase(rep_ouvrir, False, False, "Text;")
> ' Acces aux données
> ' Suppression extension
> fic_ouvrir = Left(fic_ouvrir, (ficlong - 4))
> ch_sql = "SELECT * FROM [" & fic_ouvrir & "#txt];"
> Set qdftxt = bddtxt.CreateQueryDef("", _
> ch_sql)
> Set rstlinked = qdftxt.OpenRecordset(dbOpenSnapshot)
> Set rstsuivi = bdd.OpenRecordset("SuiviAmiante")
> ' RAZ table mémo MAJ
> bdd.Execute ("DELETE * FROM liste_maj;")
> ' Traitement des données
> With rstlinked
> .MoveFirst
> ' Lecture fichier
> Do While Not .EOF
> nouveau = 0
> UT_en_cours = .Fields(0)=====> considéré comme nul
> bat_en_cours = .Fields(1)=====> bien reconnu
>
> "Aski" a écrit :
>
>> Salutatoi Twitzig,
>>
>> Tu as donc déclaré :
>>
>>> Un de mes développement contient une option de chargement d'un
>>> fichier CSV au format ci-dessous:
>>>
>>> 004380N;002;00;001;0;LV;88,5
>>> 004380N;006;00;001;0;BU;26,9
>>> 004380N;012;00;001;0;SS;873,1
>>> 005150S;004;00;001;0;HM;109,7
>>> 005150S;006;00;001;0;HM;106,0
>>> 005150S;012;00;005;0;HM;6,5
>>>
>>> Avec la totalité des fichiers traités à ce jour, tout se passe bien.
>>> Par contre, avec celui ci-dessus, le premier champ de la première
>>> ligne est considéré comme nul (alors que le second est bien vu comme
>>> égal à 2)
>>> Si je supprime les 2 premières lignes, la suite se passe bien pour
>>> quelques lignes, puis le pb se reproduit.
>>>
>>> J'ai vérifié avec un éditeur hexa qu'il n'y avait pas de caractères
>>> cachés dans le fichier.....
>>>
>>> Quelqu'un aurait il une idée?
>>
>> Ce serait plus facile à déboguer avec un extrait de ton code
>> (décodage des lignes)
>>
>> --
>> Cordialement
>>
>> Aski
>>
>> AntiSpamEdit - Version 1.6.4 du 12/08/05
>> Aide de K9 en français
>> http://h.charlier.de.chily.perso.cegetel.net/
>> ou
>> http://h.dechily.free.fr/





Avatar
Gloops
Salut,

Tu déclares quoi comme références ?

J'ai justement posé une question il y a quelques jours pour pouvoir
ouvrir un fichier texte avec un contrôle Data, ce qui rejoint
l'instruction d'ouverture de base avec le format "Text;", je n'ai pas eu
de réponse. J'ai l'erreur 3343, format de base de données non reconnu.


Au demeurant tu gagnerais probablement en lisibilité du code en rejetant
la fonction de sélection de fichier dans un autre module, mais ça c'est
une autre question.
Avatar
Jean-Marc
"Gloops" a écrit dans le message de
news:437fb3f1$0$19697$
Salut,

Tu déclares quoi comme références ?

J'ai justement posé une question il y a quelques jours pour pouvoir
ouvrir un fichier texte avec un contrôle Data, ce qui rejoint
l'instruction d'ouverture de base avec le format "Text;", je n'ai pas eu
de réponse. J'ai l'erreur 3343, format de base de données non reconnu.


Au demeurant tu gagnerais probablement en lisibilité du code en rejetant
la fonction de sélection de fichier dans un autre module, mais ça c'est
une autre question.




Hello,

voici le code complet pour faire l'ouverture et la lecture d'un fichier
texte avec
un recordset, méthode normale.
La seule référence à inclure est Microsoft DAO 3.6

voici, le code est commenté:

' 8<----------------------------------------

Option Explicit

Private Sub Command1_Click()
Dim fileName As String
Dim db As Database
Dim rs As Recordset

' ouverture de la DB, premier argument = le nom du
' répertoire ou se trouve le fichier texte
Set db = OpenDatabase("c:", False, False, "Text;")

' le nom du fichier ou se trouvent les données
fileName = "fictxt.txt"
'
' Exemple de fichier texte
' Note: la première ligne contient les noms des colonnes
'
' NOM;PRENOM;ADRESSE;CP;VILLE;TEL
' dupont;robert;35,rue des lilas;35000;rennes;0033299365412
' durand;jean;24,rue des roses;22000;st brieuc;0033296365412
'
' un SELECT * pour récupérer toutes les données
sqlStatement = "SELECT * FROM [" & fileName & "];"

' et on ouvre normalement
Set rs = db.OpenRecordset(sqlStatement, dbOpenSnapshot)

If rs.EOF And rs.BOF Then
' pas d'enregistrements
Else
' parcours normal du recordset
rs.MoveFirst
While Not rs.EOF
' debug.print rs.fields("NOM")
rs.MoveNext
Wend
End If
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
End Sub

' 8<----------------------------------------

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jean-Marc
une erreur de copier/coller m' afait oublier:

Dim sqlStatement As String


--
Jean-marc
Avatar
Gloops
Jean-Marc a écrit, le 20/11/2005 17:05 :
Set db = OpenDatabase("c:", False, False, "Text;")



Ah, ainsi donc c'est le répertoire qu'il faut considérer comme base de
données, et le fichier texte sera considéré comme table. C'est ça que je
n'avais pas compris, c'est pour ça que ça ne marchait pas.

Pour en revenir à l'exemple de Twitzig, voici ce que j'obtiens : en
laissant le fichier source tel quel, j'obtiens dès le début de
l'affichage du résultat une erreur de dépassement de champ numérique. Si
j'ajoute une apostrophe au début de chaque enregistrement, tout se passe
bien.

Il semble donc que le moteur de base de données interprète les champs
comme le fait Excel : si un champ commence par un chiffre il est
considéré comme un champ numérique, donc si on a une lettre dedans
ensuite on se trouve en difficulté.

Je jetterais bien un coup d'oeil à la procédure d'erreur, si il y en a
une. Il est possible que d'autres paramétrages, ou d'autres moteurs de
bases de données, permettent d'interpréter différemment les types de
champs. Je soupçonne que l'explication du problème peut être à chercher
de ce côté.

Je n'ai pas vu les autres fichiers exemples, utilisés en entrée.
Contiennent-ils aussi des champs comportant des chiffres et lettres
mélangés, avec un chiffre en tête de champ ?