Supprimer ligne connue dans fichier .txt VBA

Fermé
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 - 19 janv. 2012 à 12:26
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 4 févr. 2012 à 09:06
Bonjour, je sais que des messages et sujets existent concernant cette question mais pour le moment je n'ai pas eu les réponses voulues

Donc j'ai un fichier .txt de 20Mo mini qui sort avec environ 120.000 lignes. Il s'agit d'une extraction donc pas trop moyen de modifier le fichier. J'ai absolument besoin de supprimer la première ligne afin de traiter le reste du document (la première ligne est inutile et n'a aucun interet pour le traitement). La suppression de cette ligne me permettrait l'importation de mon fichier avec un modèle spécialiser donc tout est prévu. Mais je n'arrive pas à supprimer ma premiere ligne.

Voici donc mon code (il marche sur de petits fichiers. Mais sur le mien, qui contient les carrés noirs de retour à la ligne, il supprime l'entièreté du document. Embetant ceci...)

Sub suppr_1e_ligne()
Dim colLignes As New Collection
Dim ff As Integer
ff = FreeFile

Dim sLigne As String

'Lecture du fichier, envois chaque ligne dans la collection
Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUQ_MOBISTORE_15314CEN_19122011.txt" For Input As #ff
    While Not EOF(ff)
        Line Input #ff, sLigne
        colLignes.Add sLigne
    Wend
Close #ff

'Suppression des lignes 5 et 11 par exemple
colLignes.Remove 1

'Réecriture du fichier
Dim i As Integer
Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUQ_MOBISTORE_15314CEN_19122011.txt" For Output As #ff
   For i = 2 To colLignes.Count
        Print #ff, colLignes(i)
   Next i
Close #ff

End Sub



A voir également:

20 réponses

Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
3 févr. 2012 à 15:19
Sub suppr_1e_ligne()
  Dim sLignes As String
  Dim i As Long
  Dim ff As Integer
  ff1 = FreeFile
  ff2 = FreeFile
 Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUM_MOBISTORE_15314CEN_31122011.txt" For Input As #ff1
  Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUM_MOBISTORE_15314CEN_31122011(test).txt" For Output As #ff2
  i = 1
        While Not EOF(ff)
            Line Input #ff, sLigne
            If i <> 1 Then
                colLignes.Add (sLigne)
            End If
            i = i + 1
        Wend
End Sub

Ou
Sub suppr_1e_ligne()
Dim colLignes As New Collection
Dim F1 As Integer, F2 As Integer
F1 = FreeFile
F2 = FreeFile
Dim sLigne As String, i As Long
'Lecture du fichier 1, écriture dans fichier 2
Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUM_MOBISTORE_15314CEN_31122011.txt" For Input As #F1
Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUM_MOBISTORE_15314CEN_31122011(test).txt" For Output As #F2
    While Not EOF(F1)
        Line Input #F1, sLigne
        i = i + 1
        If i <> 5 And i <> 11 Then
            Print #F2, sLigne
        End If
    Wend
Close

Le premier code est adapté pour pouvoir entrer dans le fichier et ressortir et sur les deux codes je tombe sur une erreur récurrente : erreur d'execution 55 : Le fichier est déjà ouvert, alors que pas du tout.
3
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
19 janv. 2012 à 15:47
Et pourrais tu m'ajouter une précision? Comment pourrait on repasser d'une table Access final à X fichier texte (avec les points virgules et tout comme séparateur là je sèche totalement) correspondant à un paramètre d'une autre table access.
En gros l'algo donnerait un truc du genre
X en référence à la table Référentiel
X = X+1
Pour X = 1, créer X fichiers texte (ou csv enfin j'suis pas pointilleux sur la terminaison et le format).


Sachant que j'aurais pas X tables dans ma base je préfère les séparer en code sinon ça risque d'etre trop long avec le moteur d'access.

Merci beaucoup pour la 1e partie déjà =)
1
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
19 janv. 2012 à 16:23
J'ai rien pigé :-)
Donne un exemple concret
0
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
19 janv. 2012 à 16:31
et bah mon fichier texte est rempli, le but est de le diviser selon un choix que je connais déjà et que ce soit sous la meme forme.
La forme étant :
champ1;champ2;champ3;champX
valeur1;;valeur3,valeurX
Ceci est un exemple bien sur. J'ai 37 champs comme ça et pas toujours rempli donc mettre rien dans les trucs vides et rendre les valeurs entre guillemets quand il y a une valeur correspondante. J'espère avoir été plus clair =)
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
19 janv. 2012 à 16:38
Pas tellement,
En gros tu veux créer des fichiers Csv comprenant 1 ou plusieurs lignes de la table en gardant les colonnes pour par exemple les ouvrir dans Excel en gardant les bonnes colonnes. ?
0
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
19 janv. 2012 à 17:17
J'ai un indicateur dans mon tableau qui différencie les PFC des PDV. Une PFC contient des PDV (en gros c'est le lien parent). Je voudrais créer un csv par PFC donc pour ça je lance une requete en VB en rentrant le PFC en paramètres en faisant un compteur ou une boucle pour chaque et qu'après j'ai un petit fichier par PFC au lieu d'un monstre ou tout est regroupé.n Je sais pas trop si c'est plus clair mais bon dis moi si tu as besoin de plus de détails. Et malheureusement je ne peux pas joindre le fichier pour des questions économiques et de politique de confidentialité...
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
19 janv. 2012 à 17:25
Ça commence à viendre.. :-)
Tu à donc 37 colonnes dans ton PFC mais combien de lignes ?

Après la requête d'un PFC tu veux créer un fichier mais pour quel destination ?
1
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
20 janv. 2012 à 18:00
Relire ma question
Tu n'y répond pas explicitement
1

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

Posez votre question
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
3 févr. 2012 à 17:28
Sub suppr_1e_ligne()
  Dim sLignes As String
  Dim i As Long
  Dim ff1 As Integer
  Dim ff2 As Integer
  ff1 = FreeFile
  ff2 = FreeFile
 Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUM_MOBISTORE_15314CEN_31122011.txt" For Input As #ff1
  Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUM_MOBISTORE_15314CEN_31122011(test).txt" For Append As #ff2
  i = 1
        While Not EOF(ff)
            Line Input #ff, sLigne
            If i <> 1 Then
                colLignes.Add (sLigne)
            End If
            i = i + 1
        Wend
End Sub
Et pourtant si c'est bien le code exact que j'ai sur mon fichier ^^' mais l'erreur est récurrente. Et toujours sur la ligne du Append.
1
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
4 févr. 2012 à 09:06
Un peu de rigueur stp.
Tu déclare : sLignes et tu emploi sLigne (sans S)
Tu déclare :ff1 et tu emploi ff
Tu oublie de déclarer la collection
....
Pour éviter tout ça met tout en haut du module Option Explicit
Mais j'ai quand même trouver ton problème (j'aurais dû y penser plus vite :-))
Sub suppr_1e_ligne()
  Dim sLignes As String
  Dim i As Long
  Dim ff1 As Integer
  Dim ff2 As Integer
  ff1 = FreeFile
 
 Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUM_MOBISTORE_15314CEN_31122011.txt" For Input As #ff1
 ff2 = FreeFile 'ICI L'ERREUR, Freefile donne le nombre de fichier OUVERT +1
  Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUM_MOBISTORE_15314CEN_31122011(test).txt" For Output As #ff2
  i = 1
         While Not EOF(ff1)
            Line Input #ff1, sLignes
            If i <> 1 Then
                Print #ff2, sLignes
            End If
            i = i + 1
        Wend
        Close
End Sub

A+
1
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 19/01/2012 à 13:07
Ce serait plus simple de ne pas ajouter les lignes concernées.
        Dim i As Integer = 1  
        While Not EOF(ff)  
            Line Input #ff, sLigne  
            If i <> 5 And i <> 11 Then  
                colLignes.Add(sLigne)  
            End If  
            i += 1  
        End While

Pour éviter les lignes 5 et 11
A+
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 19/01/2012 à 13:43
Un peu plus simple ?
Sub suppr_1e_ligne() 
Dim colLignes As New Collection 
Dim F1 As Integer, F2 As Integer 
F1 = FreeFile 
F2 = FreeFile 
Dim sLigne As String, i As Long 
'Lecture du fichier 1, écriture dans fichier 2 
Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUQ_MOBISTORE_15314CEN_19122011.txt" For Input As #F1 
Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUQ_MOBISTORE_15314CEN_19122011.txt" For Output As #F2 
    While Not EOF(F1) 
        Line Input #F1, sLigne 
        i = i + 1 
        If i <> 5 And i <> 11 Then 
            Print #F2, sLigne 
        End If 
    Wend 
Close 
End Sub

'Suppression des lignes 5 et 11 par exemple
EDIT : Je n'avais pas vu que c'est le même nom de fichier.
Emploi plutôt mon premier exemple.
Pour l'exemple ici faut passer par un fichier temporaire, si le temps est un critère, cet exemple serai plus rapide
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
19 janv. 2012 à 18:06
Euh la destination juste sur mon pc en .csv après ce sont les utilisateurs finaux qui se débrouilleront y'a pas de contraintes à ce niveau. Les lignes sont variables, donc je crois que c'est acTransfertText avec acExportDelim à utiliser. Mais j'arrive pas à la faire fonctionner je sais pas pourquoi. Là mon exemple à 122.000 lignes dont 60 PFC. Donc les lignes seront réparties sur ces PFC (pas spécialement de façon égale).
En gros on va dire que PFC est un client généraliste qui regroupe sous son aile différents point de vente et on me demande de faire une division par ces memes PFC. Grace à toi le début de mon import access est valide, import réalisé depuis un .txt basique avec ; comme séparateur de colonne. L'importation a déjà été testée et marche il me manque que la sortie ou j'ai déjà ma boucle sur la table de référentiel de prete. Et la boucle donnera donc :
Pour X de 0 à EOF
Créer .txt regroupant les points de vente qui lui sont rattachés.

Et donc je crée une requete pour créer mon référentiel et lié les PDV aux PFC. Et ensuite bah viens la boucle du code et la sortie en X fichiers (X = nbre PFC) txt si possible ça sera le mieux. Euh là je crois etre au plus précis. Merci beaucoup =)
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
19 janv. 2012 à 19:36
J'ai compris, mais ta table... ce ne serait pas le fichier que tu traite plus haut ?
Si oui, tu connais (ou peu connaitre) exactement le nombres de lignes par PFC
0
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
20 janv. 2012 à 11:23
Je peux le connaitre effectivement, mais je voulais accelerer l'execution via le vba plutot que de faire plusieurs requetes dans Access. Mais il y aurait énormément de table ou des comptages à faire pour avoir ses informations et je me demande si ce ne serait fastidieux pour ne pas etre utile.
Et si j'ai bien compris ta question à la base j'ai trois fichiers : PDV et referentiel PFC. Mon but est de diviser la table PDV en X table, X étant le nombre de PFC différentes.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
20 janv. 2012 à 14:35
Tu fais un import txt dans access de tout le fichier, pourquoi pas passer en revue tes PFC et les exporter en texte ?
Ou alors j'ai pas compris.
0
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
20 janv. 2012 à 16:38
bin parce que faire une mini base Access c'est plus simple je peux automatiser les requetes SQl en VB c'est vachement plus cool/simple. Et on me demande ça pour garder un historique/referentiel. Il faut que ce soit du txt, il n'y a à priori pas d'utilisation Excel derrière. On me l'a précisé au dernier moment car je partais sur du Excel qui aurait grandement simplifier le traitement. Et on peut faire le meme traitement qu'Access directement dans un fichier texte en divisant le tout en plusieurs fichiers différents?
0
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
3 févr. 2012 à 14:56
Bonjour, je reviens vers vous suite à quelques test (j'ai été malade dernièrement et n'aie pas pu avancer mon boulot donc pas de réponses je m'excuse d'ailleurs de ce silence). Donc j'ai testé vos deux solutions et je tombe sur des erreurs qui me laissent perplexe et que je ne connais pas du tout (et je ne remercierai pas l'aide windows pour ceci =° )
Donc : le code avec F1 et F2 me retourne sans cesse "Fichier déjà ouvert" et j'ai meme testé de créer un nouveau fichier et de copier mes données dans ce nouveau fichier (en le nommant de façoàn identique avec simplement test pour le différencier à la fin du libellé du fichier)
L'autre code quant à lui me dit que le mode d'accès au fichier est incorrect (je passe par un open : ... ) ou sinon si je lui donne une entrée et une sortie il me dit que le fichier est déjà ouvert. Bref je ne comprends pas vraiment et je me sens quelque peu perdu sur ce coup là. Je vous remercie de l'aide fournie auparavant et de la future aide si jamais vous prenez à nouveau le temps de me répondre =)
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
3 févr. 2012 à 15:16
C'est pas que je veux pas suivre mais je comprend rien, met ton code dans un poste suivant, je verrais si je peux l'adapter.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
3 févr. 2012 à 15:36
ton fichir ..
FUM_MOBISTORE_15314CEN_31122011(test).txt
Existe-t'il réellement ?, j'en doute. !!
0
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
3 févr. 2012 à 15:50
Il est vide mais il existe je l'ai créé spécialement pour ça (d'ou le petit test à la fin pour voir si ça fonctionnait mieux en dupliquant le fichier en gros). Et c'est là que je sèche, j'vois pas pourquoi on me dit fichier déjà ouvert sur le output alors qu'il est là et qu'il attend juste de se faire remplir.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 3/02/2012 à 16:06
Probable que j'ai compris, si tu met Output tu ne peu ajouter qu'une seule fois.
Faudrait que je fasse quelque test mai essaye quand même..
Open "C:\Documents and Settings\sghn4628\Desktop\Sujet PFC\FUM_MOBISTORE_15314CEN_31122011(test).txt" For Output As #F2

en remplaçant Output par Append.
Je pense que ça devrait fonctionner.
Sinon,.. tu dis je verrais plus en profondeur.
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0
Oukapaka Messages postés 112 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 22 août 2016 5
3 févr. 2012 à 16:37
Le append me donne toujours la meme réponse. Je n'ai pourtant pas l'impression de faire d'erreurs de déclarations, d'oublie ou quoi. Et puis cette erreur 55 reste une chose que je ne savais pas réellement possible : un fichier ouvert alors que rien n'est ouvert (j'ai aussi testé voir si le fait de laisser le dossier ouvert posait probleme mais rien n'y fais je ne comprends vraiment pas cette chose. Et je ne sais plus franchement quoi faire je reste sidéré face à de telles inepties... Merci encore du mal que vous vous donnez pour moi =)
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 3/02/2012 à 17:20
j'ai pas l'impression que tu a remplacer Output par Append.
Quoi qu'il en soit.. un peu de calme serait beaucoup mieux.
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0