Importer la 1ère ligne d'un fichier .txt

Résolu
evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005 - 25 nov. 2004 à 10:20
evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005 - 1 déc. 2004 à 10:58
Salut all !

J'aimerai importer un fichier texte dans ACCESS, mais je ne voudrais importer QUE la 1ère ligne ! Sachant qu'il y a des données en dessous mais je ne les veux pas.
Savez-vous comment faire svp pour lui dire dans un paramètre de ne prendre que cette ligne ?

Par ailleurs, ce fichier texte est délimité par des points-virgule. Savez une fonction permettant de passer en paramètre le type de délimiteur defaçon à ce qu'il importe tout seul dans une table donnée ?

Merci bcp à ceux qui peuvent m'aider ! :-)

21 réponses

evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005
1 déc. 2004 à 10:58
Bon, j'ai cherché et j'ai trouvé la méthode.

La voici :

Private Sub CmdExecute_Click()

Dim ch As String
Dim n_occ
Dim File As String
Dim rcsFormulaire As Recordset
Dim nFile As String

nFile = "chemin_de_mon_fichier_txt"

Set rcsFormulaire = dbAudit.OpenRecordset("Formulaire2004")

Open nFile For Input As #1
Line Input #1, ch

Close #1

n_occ = Split(ch, ";")

rcsFormulaire.AddNew'on ouvre l'accès pour l'ajout

For i = 0 To UBound(n_occ)
rcsFormulaire.Edit 'puis on édite cette ligne à chaque champ
rcsFormulaire.Fields(i + 1) = n_occ(i) 'il remplit avec les valeurs à stockées dans notre tableau

rcsFormulaire.Update 'Permet l'ajout même dans la base
Next i ' On incrémente notre compteur pour passer au champs suivant de du fichier .txt mais aussi celui de la base

'Fermeture du recordset
rcsFormulaire.Close
Set rcsFormulaire = Nothing



J'accepte ma propre réponse :-)
3
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
25 nov. 2004 à 11:00
Bonjour,

Voila un petit bout de code qui doit fonctionner.
On lit uniquement un ligne dans le fichier texte.
Par split on met dans le tableau nb_occ tout ce qui est entre des ;

dim ch as string
dim nb_occ

Open "fichier.txt" for input as #1
input #1, ch ' Lit la première ligne du fichier texte
close #1

n_occ = Split(ch, ";")
For i = 0 To UBound(n_occ)
n_fic(i)
next i
0
gandalflegris007 Messages postés 211 Date d'inscription lundi 31 mars 2003 Statut Membre Dernière intervention 11 juin 2007
25 nov. 2004 à 11:02
Salut evilmajestik,

la lecture de fichier texte de toute manière ne se fait que ligne à ligne via la commande line input.

Il suffit donc d'ouvrir ton fichier texte, de récupérer la ligne et de le fermer
>
' Fonction qui reçoit en paramètre le nom du fichier texte
' et retourne la 1ère ligne lue
public Function ImportLigTxt(pNomFichier as string) as string
Dim NumFile as integer
Dim Ligne as string

NumFile = FreeFile ' récupère un index de fichier vide

open pNomFichier for input as NumFile
Line Input #NumFile, Ligne
close #NumFile

ImportLigTxt = Ligne
End Function

et dans ton code main, tu appelles cela avec

MaLigne = ImportLigTxt("c:\toto.txt")

et le tour est joué.

Guich
0
gandalflegris007 Messages postés 211 Date d'inscription lundi 31 mars 2003 Statut Membre Dernière intervention 11 juin 2007
25 nov. 2004 à 11:03
oopps, j'ai été trop long à écrire mon code ...
0

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

Posez votre question
evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005
25 nov. 2004 à 11:15
Merci bcp mais le fait qu'il y ait un délimiteur est gênant, connaissez-vous une fonction comme sous PostGreSQL qui permet de spécifier un délimiteur pour qu'il importe automatiquement dans une table ACCESS ?
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
25 nov. 2004 à 11:21
Je ne vois pas où est le problème.
Il suffit de renseigner tes champs dans la boucle finale.
Il faut bien sûr auparavant avoir ouvert une connexion à la base, créer un recordset et ajouter ou s'être positionné sur un enregistrement.

dim ch as string
dim nb_occ

Open "fichier.txt" for input as #1
input #1, ch ' Lit la première ligne du fichier texte
close #1

n_occ = Split(ch, ";")
For i = 0 To UBound(n_occ)
rst.fields(i)=n_occ(i) ' remplit les champs d'un recordset avec les occurences trouvées.
next i
0
evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005
25 nov. 2004 à 13:54
Euh... ca ne fonctionne pas ton code, du moins une partie car il n'importe que le premier champs puis s'arrête...

Peux-tu me dire d'ou ça peut venir ?

merciiiiiiii
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
25 nov. 2004 à 14:38
Ben oui, on ne lit que la première ligne du fichier. C'est bien ce que tu voulais.

Sinon il faut faire une boucle avec :
Open "fichier.txt" for input as #1
while not eof(1)
input #1, ch
'traitement pour spliter ch et ajouter les champs dans la base access
wend
close #1
0
evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005
25 nov. 2004 à 14:40
Oui la première ligne de mon fichier texte mais dans mon fichier texte, j'ai plusieurs champs... et là ça s'arrêtaient au premier champs...

Je vais tester ça, merci !
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
25 nov. 2004 à 14:47
Pour résumer la première ligne vaut :
ccar1;ccar2;ccar3;ccar4

et lorsque tu fais

input #1, ch

ch vaut "ccar1" en non "ccar1;ccar2;ccar3;ccar4"

attention après le split
n_occ(0)="ccar1"
n_occ(1)="ccar2"
n_occ(2)="ccar3"
n_occ(3)="ccar4"

donnes-moi plus précisément tes valeurs
0
evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005
25 nov. 2004 à 15:07
Voilà mes valeurs :

"test alex";"23/11/2004";"PAEN/AUD/SPE";"PAEN/AUD";

Et voilà mon code actuel :

Set rcsFormulaire = dbAudit.OpenRecordset("Formulaire2004")

While Not EOF(1)
Input #1, ch
n_occ = Split(ch, ";")
For i = 0 To UBound(n_occ)

rcsFormulaire.addnew
rcsFormulaire.Fields(i + 1) = n_occ(i) ' remplit les champs d'un recordset avec les occurences trouvées.
rcsFormulaire.Update
Next i
Wend
Close #1

Je sais que mon code n'est pas bon, mais justement, ça vous donne une idée et j'espère que vous pourrez m'aider à le corriger :-)

A+
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
25 nov. 2004 à 15:28
"test alex";"23/11/2004";"PAEN/AUD/SPE";"PAEN/AUD";

Déja il faut ouvrir une connection avant le recordset. Je ne peux t'aider, je ne connais pas le type de base sur laquelle tu travaille.

Set rcsFormulaire = dbAudit.OpenRecordset("Formulaire2004")

Open "fichier.txt" for input as #1
Input #1, ch
' ch vaut "test alex";"23/11/2004";"PAEN/AUD/SPE";"PAEN/AUD";
' c'est la première ligne
Close #1

n_occ = Split(ch, ";")
' n_occ(0) vaut "test alex"
' n_occ(1) vaut "23/11/2004"
' n_occ(2) vaut "PAEN/AUD/SPE"
' n_occ(3) vaut "PAEN/AUD"

rcsFormulaire.addnew
' On ne fait qu'un seul addnew pour ajouter un seul enregistrement

For i = 0 To UBound(n_occ)
rcsFormulaire.Fields(0) = n_occ(0) ' remplit les champs d'un recordset avec les occurences trouvées.
Next i

rcsFormulaire.Update
' il vaut mieux faire le update à la sortie de la boucle

test dans le debug et dis-moi si les valeurs que tu obtient sont les mêmes que dans les rem.
0
evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005
25 nov. 2004 à 15:47
En fait, parès le Input #1, ch (au début)
ch vaut "test alex" et c'est tout
Il prend pas le reste de la ligne qui est derrière...
0
evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005
25 nov. 2004 à 15:59
n_occ ne me renvoit rien du tout alors que je l'ai déclaré en String et sur la ligne suivantre : For i = 0 To UBound(n_occ) il me met une erreur sur UBOund : "Tableau attendu".

Bref, c'est la cata ! lol
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
25 nov. 2004 à 16:01
Effectivement, deux solutions.

La première

Open "fichier.txt" for input as #1
Input #1, ch1
' ch1=test alex
input #1, ch2
' ch2=;"23/11/2004";"PAEN/AUD/SPE";"PAEN/AUD";
ch=chr(34)+ch1+chr(34)+ch2
' ch vaut "test alex";"23/11/2004";"PAEN/AUD/SPE";"PAEN/AUD";
' c'est la première ligne
Close #1

on garde le même chjose pour la suite.

Seconde solution.

Les caractères " , et ; sont des caractères réservés pour les fichier en accès séquentiel (fichier texte) en basic.

print #1, "aze", met un tab après aze
print #1, "aze"; ne met pas de CR_LF (retour chariot en fin de ligne)
Si tu retire des " dans tes lignes en entrée ça fonctionne, tu peux garder les séparateurs ; il ne sont pas génants en entrée.
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
25 nov. 2004 à 16:05
pour le ubound pas besoin de déclaration en string. comme j'ai mis au debut :
dim nb_occ
0
gandalflegris007 Messages postés 211 Date d'inscription lundi 31 mars 2003 Statut Membre Dernière intervention 11 juin 2007
25 nov. 2004 à 16:05
ton n_occ tu l'a déclaré en strong ou en tableau de string
ATTENTION : il y a une différence entre
Dim n_occ as string ET
Dim n_occ() as string.

Dans le cas présent il faut déclarer selon la 2ème méthode.

Guich
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
25 nov. 2004 à 16:05
pour le ubound pas besoin de déclaration en string. comme j'ai mis au debut :
dim nb_occ
0
evilmajestik Messages postés 38 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 5 juillet 2005
25 nov. 2004 à 16:16
J'ai bien compris la première solution, le truc c'est que j'ai 60 champs à remplir, alors c'est bcp trop long....

J'ai pas bien compris la 2ème méthode pledoux.
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
25 nov. 2004 à 16:22
D'après le test que j'ai fait, le premier champs est lu dans le premier input et les 59 suivants dans le second input.
Il suffit alors de concaténer les deux chaines (ch1 et ch2) pour avoir les 60 champs comme dans l'exemple.
Dis-moi si je suis à côté de la plaque.
0
Rejoignez-nous