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

Lecture séquentiel d'un fichier texte

3 réponses
Avatar
TopJB
Bonjour,

Voila j'ai une erreur de je ne trouve pas. Je souhaite lire un fichier
.csv en mode séquentiel (Ligne par ligne). A chaque ligne lue je stocke
la valeur dans un tableau. Après je dois trier ces lignes selon un
identifiant et rajouter des lignes entre les différentes lignes du
fichier et cet ajout est aléatoire.

Fichier :

Ligne 2
Ligne 3
Ligne 20
Ligne 36
Ligne 80

Ligne à ajouter :
Ligne 4
Ligne 5
Ligne 40
Ligne 41
Ligne 81

Ce qui doit donner en fin de fichier :

Ligne 2
Ligne 3
Ligne 4 (Ajout)
Ligne 5 (Ajout)
Ligne 20
Ligne 36
Ligne 40 (Ajout)
Ligne 41 (Ajout)
Ligne 80
Ligne 81 (Ajout)

Pour faire la lecture séquentiel j'utilise le code suivant :

FICTTPV est le nom de mon fichier avec le path complet

Dim TableFile() as string
dim NbLigne as long

NbLigne=0

Set obj = CreateObject("Scripting.FileSystemObject")

'Lecture du fichier existant et reclassement des produits par IdArticle
Set TextLecture = obj.OpenTextFile(PathFICTPV, 1)
Do While Not TextLecture.AtEndOfStream
TabFile(NbLigne) = TextLecture.ReadLine
NbLigne = NbLigne + 1
Loop
TextLecture.Close

Mon fichier FICTPV existe c'est un .csv, il contient une ligne.

Or dès la première lecture en débug, le passage sur la ligne
TebFile(NbLigne) = TexteLecture.ReadLine
Il me met un message d'erreur du style que le fin du fichier est dépassé .

Or il devrait lire la première ligne.

Merci de me dire ou je me plante.

3 réponses

Avatar
Fabien
TopJB a écrit :
Bonjour,

Voila j'ai une erreur de je ne trouve pas. Je souhaite lire un fichier
.csv en mode séquentiel (Ligne par ligne). A chaque ligne lue je stocke
la valeur dans un tableau. Après je dois trier ces lignes selon un
identifiant et rajouter des lignes entre les différentes lignes du
fichier et cet ajout est aléatoire.

Fichier :

Ligne 2
Ligne 3
Ligne 20
Ligne 36
Ligne 80

Ligne à ajouter :
Ligne 4
Ligne 5
Ligne 40
Ligne 41
Ligne 81

Ce qui doit donner en fin de fichier :

Ligne 2
Ligne 3
Ligne 4 (Ajout)
Ligne 5 (Ajout)
Ligne 20
Ligne 36
Ligne 40 (Ajout)
Ligne 41 (Ajout)
Ligne 80
Ligne 81 (Ajout)

Pour faire la lecture séquentiel j'utilise le code suivant :

FICTTPV est le nom de mon fichier avec le path complet

Dim TableFile() as string
dim NbLigne as long

NbLigne=0

Set obj = CreateObject("Scripting.FileSystemObject")

'Lecture du fichier existant et reclassement des produits par IdArticle
Set TextLecture = obj.OpenTextFile(PathFICTPV, 1)
Do While Not TextLecture.AtEndOfStream
TabFile(NbLigne) = TextLecture.ReadLine
NbLigne = NbLigne + 1
Loop
TextLecture.Close

Mon fichier FICTPV existe c'est un .csv, il contient une ligne.

Or dès la première lecture en débug, le passage sur la ligne
TebFile(NbLigne) = TexteLecture.ReadLine
Il me met un message d'erreur du style que le fin du fichier est dépassé .

Or il devrait lire la première ligne.

Merci de me dire ou je me plante.


Salut,
Ci dessous une autre solution.
Public Sub Import_txt2(Nom_Fichier As String, _
Nom_Table As String)
'Pour importer un fichier texte avec tous les champs en mode texte

Dim txtLine As String
Dim F As Integer
Dim I As Integer

Dim Nom_Champs As Variant
Dim Champs As Variant
Dim StrSQl As String
Dim Lchamps As String

F = FreeFile
Open Nom_Fichier For Input As #F

'On lit la premiére ligne : elle contient les nom des champs
Line Input #F, txtLine
Nom_Champs = Split(txtLine, ";")

'On lit la ligne suivante qui contient des données
Line Input #F, txtLine
Champs = Split(txtLine, ";")
For I = 0 To UBound(Nom_Champs)
Select Case LCase(Nom_Champs(I))
Case "licence", "identifiant":
'Si la licence ou l'identifiant sont vides alors on
enregistre
'0 dans le champs pour forcer la création du champ en
numérique (13/10/2008)
If Trim(Champs(I)) = "" Then
Lchamps = Lchamps & "0 AS [" & Nom_Champs(I) & "],"
Else
Lchamps = Lchamps & Champs(I) & " AS [" &
Nom_Champs(I) & "],"
End If

Case Else:
If InStr(1, LCase(Nom_Champs(I)), "date") > 0 Then
Lchamps = Lchamps & "cDate('" & Replace(Champs(I),
"-", "/") & "') AS [" & Nom_Champs(I) & "],"
Else
Lchamps = Lchamps & "'" & Replace(Champs(I), "'",
"''") & "' AS [" & Nom_Champs(I) & "],"
End If
End Select
Next I

StrSQl = "SELECT " & Left(Lchamps, Len(Lchamps) - 1) & " INTO [" &
Nom_Table & "];"
CurrentDb.Execute StrSQl 'On créé la nouvelle table

'On remplis la table
On Error GoTo erreur
Lchamps = ""

For I = 0 To UBound(Nom_Champs)
Lchamps = Lchamps & "[" & Nom_Champs(I) & "],"
Next I
Lchamps = Left(Lchamps, Len(Lchamps) - 1)
Do While Not EOF(F)
StrSQl = "INSERT INTO [" & Nom_Table & "] (" & Lchamps & ")
VALUES ("
Line Input #F, txtLine
Champs = Split(txtLine, ";")
For I = 0 To UBound(Champs)
Select Case LCase(Nom_Champs(I))
Case "licence", "identifiant":
'Si la licence ou l'identifiant sont vides alors on
enregistre Null dans le champs
If Trim(Champs(I)) = "" Then
StrSQl = StrSQl & "Null, "
Else
StrSQl = StrSQl & Champs(I) & ", "
End If
Case Else:
If InStr(1, LCase(Nom_Champs(I)), "date") > 0 Then
StrSQl = StrSQl & "Cdate('" &
Replace(Champs(I), "-", "/") & "'), "
Else
StrSQl = StrSQl & "'" &
Replace(RTrim(Champs(I)), "'", "''") & "', "
End If
End Select
Next I
CurrentDb.Execute Left(StrSQl, Len(StrSQl) - 2) & ");"
Loop
Close #F
Exit Sub
erreur:
MsgBox "Erreur sur champs N° " & I & " " & Nom_Champs(I) & " " &
Champs(I)
End Sub
a adapter of course ...
@+
Avatar
Gilbert
Bonjour,

Peut-être n'est-ce qu'une faute de frappe mais tu parles de
FICTTPV est le nom de mon fichier
et tu utilises
OpenTextFile(PathFICTPV, 1)

--
Cordialement,

Gilbert


"TopJB" a écrit dans le message de
news:
Bonjour,

Voila j'ai une erreur de je ne trouve pas. Je souhaite lire un fichier
.csv en mode séquentiel (Ligne par ligne). A chaque ligne lue je stocke
la valeur dans un tableau. Après je dois trier ces lignes selon un
identifiant et rajouter des lignes entre les différentes lignes du
fichier et cet ajout est aléatoire.

Fichier :

Ligne 2
Ligne 3
Ligne 20
Ligne 36
Ligne 80

Ligne à ajouter :
Ligne 4
Ligne 5
Ligne 40
Ligne 41
Ligne 81

Ce qui doit donner en fin de fichier :

Ligne 2
Ligne 3
Ligne 4 (Ajout)
Ligne 5 (Ajout)
Ligne 20
Ligne 36
Ligne 40 (Ajout)
Ligne 41 (Ajout)
Ligne 80
Ligne 81 (Ajout)

Pour faire la lecture séquentiel j'utilise le code suivant :

FICTTPV est le nom de mon fichier avec le path complet

Dim TableFile() as string
dim NbLigne as long

NbLigne=0

Set obj = CreateObject("Scripting.FileSystemObject")

'Lecture du fichier existant et reclassement des produits par IdArticle
Set TextLecture = obj.OpenTextFile(PathFICTPV, 1)
Do While Not TextLecture.AtEndOfStream
TabFile(NbLigne) = TextLecture.ReadLine
NbLigne = NbLigne + 1
Loop
TextLecture.Close

Mon fichier FICTPV existe c'est un .csv, il contient une ligne.

Or dès la première lecture en débug, le passage sur la ligne
TebFile(NbLigne) = TexteLecture.ReadLine
Il me met un message d'erreur du style que le fin du fichier est dépassé .

Or il devrait lire la première ligne.

Merci de me dire ou je me plante.


Avatar
TopJB
Merci pour ces réponses.

Mais j'ai trouvé la solution

mon code était bon mais le problème venait du fait que je n'avais pas
redimensionner mon tableau TabFile pour le stockage des lignes entre la
déclaration et l'insertion des lignes dans la tableau.

donc la ligne : TabFile(NbLigne) = TextLecture.ReadLine était en erreur
sur la partie TabFile(NbLigne) car la tableau n'était pas dimensionné :/

La boulette de base du programmeur l'initialisation de variable.
Bouh je suis mauvais :_(

P.S.: Oui c'était une erreur de frappe :)


Gilbert a écrit :
Bonjour,

Peut-être n'est-ce qu'une faute de frappe mais tu parles de
FICTTPV est le nom de mon fichier
et tu utilises
OpenTextFile(PathFICTPV, 1)