Visual Basic Express - Mise en forme fichier CSV [Résolu]

Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 25 avril 2018 à 16:25 - Dernière réponse :
Messages postés
12255
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 novembre 2018
- 26 avril 2018 à 22:52
Bonjour,
Dans un premier temps je voulais vous remercier pour ce forum sur lequel j’ai trouvé d’innombrable aide et tutoriel, donc merci à toutes et à tous pour votre participation et le partage d’information.

Je me permets de vous demander de l’aider sur un problème ou je ne trouve pas de solution.

Je m’explique je développe une petite application avec Visual Basic Express 2010. J’ai créé un formulaire ou j’exporte les données d’une DataGridView au format *.CSV.

Tout se passe bien mais à présent je bloque sur la mise en forme du fichier. Je m’explique je souhaite créer un bouton, lire le fichier et effectuer les modifications suivantes.

Exemple j’ai un fichier avec x colonne :
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N,121212
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N,878121
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N
267412010,1/30/2018,TRAINBUS ,RIN DIDIER,PFN,92,55,92,75,N,N
267412010,1/30/2018, TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N

J’aimerai conserver juste les lignes suivantes :
267412010,1/30/2018,DYNAGRI,RIN DIDIER,PFN,92,55,92,75,N,N,121212
267412010,1/30/2018,DYNAGRI,RIN DIDIER,PFN,92,55,92,75,N,N,878121

Je ne sais pas comment faire, si une personne peu m’aider, un grand merci par avance
Afficher la suite 

Votre réponse

38 réponses

Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
- Modifié par vb95 le 25/04/2018 à 17:58
0
Merci
Bonjour !
Tu écris : Exemple j’ai un fichier avec x colonne
Je n'ai jamais vu un fichier avec des colonnes : un fichier texte a un certain nombre de lignes
Maintenant chaque ligne comporte différents éléments séparés par une virgule: ceux sont eux qui peuvent représenter des colonnes
Ton fichier a l'origine fait 6 lignes et tu ne veux garder que 2 lignes
On remarque que les lignes à garder ont une colonne en plus et que cette colonne contient une valeur numérique

Découpe ton fichier en une collection de String avec Split
Ensuite tu parcours la collection et tu supprimes celles dont le dernier caractère est = "N" vu que tu ne gardes pas les lignes qui se terminent par un "N"
Ensuite tu reconstruis ton fichier avec les lignes gardées dans la collection

Autre chose : aucune des 6 lignes du fichier d'origine ne contient DYNAGRI . Faut-il alors remplacer TRAINBUS par DYNAGRI dans le fichier de 2 lignes ?

Commenter la réponse de vb95
Messages postés
12255
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 novembre 2018
- 25 avril 2018 à 17:56
0
Merci
Bonsoir

@VB
Ensuite tu parcours la collection et tu supprimes celles dont le dernier caractère est = "N" vu que tu ne gardes pas les lignes qui se terminent par un "N"
ça marche pas.

Les 2 lignes qu'il veut garder ne terminent effectivement pas par "N", mais elle contiennent des valeurs qui sont sont pas dans les 6 lignes d'exemple.

@Christophe
Est ce que le mot clé c'est DYNAGRI?
Si non, merci de poster un exemple de fichier vraiment représentatif et de préciser le(s) critère(s) de sélection.
Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 25 avril 2018 à 18:14
Salut Whis
Je ne te comprends pas
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N,121212
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N ' à suprimer
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N,878121
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N ' à suprimer
267412010,1/30/2018,TRAINBUS ,RIN DIDIER,PFN,92,55,92,75,N,N ' à suprimer
267412010,1/30/2018, TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N ' à suprimer

Si j'enlève les lignes qui se terminent par "N" il ne me reste que les 2 lignes qui se terminent par ",121212" et ",878121" ( les lignes en italique )

On remarque aussi 2 espaces supplémentaires dans les 2 dernières lignes ( un après TRAINBUS sue la ligne 5 et un après TRAINBUS sur le ligne 6) . Est-ce que ce sont des espaces parasites lors de l'écriture du post ou des espaces parasites dans le fichier .CSV d'origine?
Messages postés
12255
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 novembre 2018
- 25 avril 2018 à 18:17
Oui mais celles qu'il dit vouloir garder contienent DYNAGRI à la place de DYNAGRI, donc ce mot est probablement un des critères de choix, la afin par N peut être aussi.
Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 25 avril 2018 à 18:22
à la place de TRAINBUS plutôt
Or aucune des 6 lignes d'origine ne contient le mot DYNAGRI
Attendons la réponse du demandeur pour aller plus loin : rien ne sert d'extrapoler !
Messages postés
12255
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 novembre 2018
- 25 avril 2018 à 18:35
à la place de TRAINBUS plutôt
c'est exact
Commenter la réponse de Whismeril
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 25 avril 2018 à 20:56
0
Merci
Bonjour le Forum,

Bonjour vb95 et Whismeril,

Approche similaire de vos suggestions (split) mais avec test count=12.
        Dim readText() As String = File.ReadAllLines(myfilecsv)
        Dim currentline As String
        For Each currentline In readText
            Dim arrayline As String() = currentline.Split(",")
            If arrayline.Count = 12 Then
                MessageBox.Show(currentline)
            End If
        Next

jean-marc
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 26 avril 2018 à 10:37
Merci Vb95,

Je comprends mieux le code. Donc on compte si il y a 12 (arrayline.Count) éléments, ensuite le message box doit m'indiquer les lignes.

Dans ce cas de figure j'affiche toutes les "currentline", il faudrait que je fasse un each word in arrayline? Dite moi si je me trompe

Par contre si j’exécute la fonction, il m'indique l'ensemble des lignes de mon tableau et non ceux avec 12 éléments, il y a un point (je débute hélas) qui m'échappe si je peux avoir tes explications, par avance merci
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 26 avril 2018 à 11:56
Erratum, ça marche! J'avais un souci avec mon fichier CSV! Merci beaucoup pour votre aide!!! à présent je vais devoir réécrire le fichier ! ... (une autre galère pour un débutant)
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 26 avril 2018 à 12:10
Bonjour Christophe,

Après re-lecture de ton topic :
- pourquoi écrire tout le datagridview dans un fichier, puis triturer ce même fichier ???
- ne serait-ce pas préférable d'écrire, dans ce fichier, seulement les lignes dont la colonne x du datagridview n'est pas vide ???
Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 26 avril 2018 à 15:20
Bonjour Jean-Marc
C'est pas faux ce que tu dis
Faudrait que christophe68_is nous mette le code d'exportation de sa DataGridView vers un fichier .CSV : ainsi on écrirait dans ce fichier que les lignes à garder
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 26 avril 2018 à 15:47
Bonjour vb95,
Oui, j'aimerai bien voir comment il enregistre son fichier toto.csv contenant
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N,121212
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N,878121
267412010,1/30/2018,TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N
267412010,1/30/2018,TRAINBUS ,RIN DIDIER,PFN,92,55,92,75,N,N
267412010,1/30/2018, TRAINBUS,RIN DIDIER,PFN,92,55,92,75,N,N

Sauf erreur de part, la virgule est le délimiteur anglais et le point-virgule est pour la version française d'Excel.
Utilise-t--il Interop ???
En attente de ses réponses. Quant au message de 13h12, je n'ai pas tout compris !!!
Bon après-midi, je retourne dans ma réorg de bases IDS2.
jean-marc
Commenter la réponse de cs_JMO
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 25 avril 2018 à 20:57
0
Merci


Déjà, dans un premier temps merci à tous pour votre aide, c’est vraiment très appréciable cette entraide.
En fait ce que je souhaite faire, je veux conserver uniquement les enregistrements avec 1 colonne en plus lorsque je génère mon fichier *.csv

En exemple je viens de joindre une capture d’écran du fichier *.csv que j’ai ouvert sur Excel pour mieux vous expliquer, en rouge les enregistrements que je souhaite conserver.

Je veux conserver toutes les lignes ayant une colonne supplémentaire et effacer les autres enregistrements.
Encore un merci pour votre support
Messages postés
12255
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 novembre 2018
- 25 avril 2018 à 21:08
Dans ce cas, la solution de Jean-Marc (salut au passage) est la bonne.
Commenter la réponse de christophe68_is
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- Modifié par christophe68_is le 26/04/2018 à 13:53
0
Merci
Bonjour Cs_JMO,

En fait j'ai été un peu ambitieux, mais je me dis il faut bien commencer un jour. Je bosse dans l'informatique, mais dans le support, j'ai aucune formation en dev, et je voulais simplifier une interface pour saisir des données pour les utilisateurs.

Donc je me suis dit, on y va en avec VB Express 2010

1 - Je convertis des fichiers CSV -> datagriedview
2 - J'ajoute une colonne dans l'index 0 du tableau, et j'exporte
3 - Je supprime la 1ère ligne de mon CSV, car j'exportai le "HEADER" également
4 - Pour les fhicer CSV, je supprimer tous les ' etc et je mets en forme (ça j'ai réussi)
5 - La ou je bloquais et grâce à vous j'avance, je vais générer 2 fichiers, 1 avec 12 enregistrements, et l'autre va se réintégrer dans mon tableau avec ceux de 11 enregistrements. De cette manière l'opérateur pourra suivre l'évolution qu'il saisira dans l'ERP.

A présent je suis la: (il faut que je comprenne comment écrire dans le fichier)

Dim readText1() As String = File.ReadAllLines("c:\test\imput.csv")
Dim currentline1 As String
For Each currentline1 In readText1
Dim arrayline As String() = currentline1.Split(",")
If arrayline.Count = 12 Then
IO.File.WriteAllLines("c:\test\test.csv", ***************)
End If
Next
End Sub

Mais je suis débutant, et je l'assume totalement, mais c'est appréciable de pouvoir discuter et trouver des solutions grâce à la collaboration.


Voila l'interface:
Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 26 avril 2018 à 15:54
bonjour Christophe
Il faut comprendre ce que fait l'utilisateur
voici ce que je comprend
1) il ouvre un fichier .CSV et celui-ci s'affiche dans une DataGridView avec la première colonne vide qui est rajoutée .
2) L'utilisateur rentre de nouvelles lignes qui s'ajoutent à la DataGridview
3) A la fin de la saisie l'utilisateur enregistre sa DataGridView dans le fichier .CSV : faut-il enregistrer un seul fichier avec les lignes à garder ou 2 fichiers ( un avec toutes les lignes et l'autre avec uniquement les lignes à garder

Car il faut bien comprendre que toi tu crées ou modifies un code mais c'est l'utilisateur qui va travailler sur cette interface !

Autre chose dans le code que tu as présenté au-dessus
1) je t'ai invité à utiliser les balises de code ( voir un de mes messages au-dessus )
2) as-tu regarder comment utiliser
Io.File.WriteAllLines
! Car tu aurais compris comment écrire dans le fichier .CSV et quoi y écrire surtout .

Moi je l'ai fait le code et tout tient en 6 lignes (lecture et réécriture ) !
Mais le but du forum est t'aider et non pas de filer "du tout cuit"
Commenter la réponse de christophe68_is
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 26 avril 2018 à 16:11
0
Merci
Hello, encore merci à tous pour votre aide!

Voila comment j'ai procédé pour écrire mon fichier, et ça fonctionne parfaitement!


Private Sub Button5_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim readText1() As String = File.ReadAllLines("c:\test\imput.csv")
Dim currentline1 As String
Dim objStreamWriter As StreamWriter
objStreamWriter = New StreamWriter("C:\test\Testfile.txt")

For Each currentline1 In readText1
Dim arrayline As String() = currentline1.Split(",")
If arrayline.Count = 12 Then
objStreamWriter.WriteLine(currentline1)
End If
'Close the file.
Next
objStreamWriter.Close()
End Sub
End Class
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
12255
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 novembre 2018
- 26 avril 2018 à 19:55
Bonjour Whismeril,
Ta méthode (avec la virgule comme délimiteur) me créée bien un fichier csv avec les deux lignes souhaitées mais dans la première colonne.
C'est certainement le résultat souhaité par Christophe.
Encore un exemple de linq, de ta part, que je vais devoir mémoriser et appliquer !!! Merci.

Bonne soirée à vous trois.
jean-marc
Messages postés
12255
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 novembre 2018
>
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 26 avril 2018 à 22:52
La question intiale concerne un fichier avev virgule, donc j’ai proposé un code compatible de la virgule.
Chez toi remplace par le ; et ça ira
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 26 avril 2018 à 19:30
Salut vb95,

Non, non, je n'ai pas de souci !!!
Et si tu testes avec
        Dim inputfile As String = "C:\Users\" & Environment.UserName & "\desktop\Test.csv"
        Dim outputfile As String = "C:\Users\" & Environment.UserName & "\desktop\new_Test.csv"

        Using sw As StreamWriter = File.CreateText(outputfile)
            For Each currentline As String In File.ReadAllLines(inputfile)
                'Debug.Print(currentline)
                If currentline(currentline.Length - 1) <> "," Then sw.WriteLine(currentline)
            Next
        End Using
le fichier en sortie est-il correct ???
Je dois utiliser la virgule comme séparateur car ma version excel est sur un host british.

Whismeril, que je salue, nous corrige à l'instant !!!
Je vais tester sa proposition.
Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
>
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 26 avril 2018 à 20:31
bonsoir Jean-Marc
Je viens de tester mon fichier Test.csv avec Excel 2016 français : il faut que j'utilise le point-virgule comme séparateur pour avoir les données bien placées dans les colonnes d'Excel . Si j'utilise la virgule j'ai la ligne complète dans la première colonne

Voici mon fichier source Test.csv

267412010;1/30/2018;TRAINBUS;RIN DIDIER;PFN;92;55;92;75;N;N;121212
267412010;1/30/2018;TRAINBUS;RIN DIDIER;PFN;92;55;92;75;N;N
267412010;1/30/2018;TRAINBUS;RIN DIDIER;PFN;92;55;92;75;N;N
267412010;1/30/2018;TRAINBUS;RIN DIDIER;PFN;92;55;92;75;N;N;878121
267412010;1/30/2018;TRAINBUS;RIN DIDIER;PFN;92;55;95;75;N;N
267412010;1/30/2018;TRAINBUS;RIN DIDIER;PFN;92;55;92;75;N;N

ton fichier à toi doit être avec des virgules comme séparateur

ton code au-dessus est incorrect :
1) le dernier caractère d'une ligne n'est jamais le séparateur
2) il faut que tu comptes le nombre d'éléments de la ligne pour savoir si tu la gardes ( 12 éléments )

Ceci devrait fonctionner chez toi correctement ( chez moi il fonctionne )
Juste le séparateur à modifier
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim inputfile As String = "D:\Test.csv"
        Dim outputfile As String = "D:\new_Test.csv"

        Using sw As StreamWriter = File.CreateText(outputfile)
            Dim Lignes As List(Of String) = File.ReadAllLines(inputfile).ToList
            For Each currentline As String In Lignes
                Dim Elements() As String = currentline.Split(";"c) ' met la virgule à la place
                If Elements.Count = 12 Then sw.WriteLine(currentline)
            Next
        End Using

    End Sub


si ton Excel est anglophone tu dois utiliser la virgule comme séparateur à mon avis alors que mon Excel francophone utilise le point-virgule . Ainsi que ce soient toi ou moi nos données devraient être correctement insérées dans les colonnes ;

Par contre pour mes codes avec un Excel français il faut que les fichiers .csv soient avec le point-virgule comme séparateur pour avoir le fichier correctement mis dans les colonnes du tableur Excel
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 26 avril 2018 à 20:59
Bonsoir vb95,

Merci de ce retour d'informations.
Nous sommes en attente de test de Christophe !!!
Mais comme vous (toi & Whismeril) lui avez précisé, il ne faut pas brûler les étapes d'auto-formation avec les liens de tutoriels proposés.
Ceux-ci sont indispensables, en plus de l'aide MSDN.
Il faut être patient, approfondir tous les jours, sur x années ses connaissances, et évoluer ainsi progressivement dans tous ces langages si cette soif de connaissance est toujours vive !!!

Bonne soirée à vous,
jean-marc
Commenter la réponse de christophe68_is
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 26 avril 2018 à 16:16
0
Merci
Et justement Vb95, c'est ce que j'apprécie.
En effet il faut chercher, réfléchir et je suis 100% d'accord avec toi. Le but est justement d'évoluer et d'apprendre.

J'étais toujours sceptique quant au développement, manque de feeling, et j'ai orienté ma carrière vers le support et l'architecture réseau. Je ne souhaite aucunement devenir un développeur aguerrie loin de la l'idée mais d'apporter des améliorations aux utilisateurs.

Je serais souvent présent sur le forum, car je découvre un domaine bien plus passionnant que j'imaginais et qui suscite vraiment ma curiosité.
Messages postés
1702
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 26 avril 2018 à 16:32
Moi-même je ne suis pas du tout dans l'informatique question profession : magasinier-cariste à la retraite
Mais j'ai chopé le virus pour le développement il y a au moins 20 ans avec VB 4 dans les années 1995 et j'ai appris tout seul avec l'aide de bouquins, Google et des forums et je ne regrette rien
Penses à fermer la discussion ( voir comment à mon message précédent )
Commenter la réponse de christophe68_is
Messages postés
12255
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 novembre 2018
- 26 avril 2018 à 17:56
0
Merci
Bonsoir
moi aussi je suis autodidacte, et je peux te dire que se lancer bille en tête sans prendre la peine d'apprendre les base finit très souvent par un "échec", par exemple obligé de tout refaire à cause d'une mauvaise conception au départ qui aboutie à une impasse à 99% du projet.

VB95 t'as déjà conseillé le cours de P Lassere plus haut dans la discussion, je te conseille de prendre quelques jours pour suivre ce cours de A à Z, et gagner beaucoup de temps à l'avenir.
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 26 avril 2018 à 21:07
Bonsoir Whismeril, Jean Marc,

je vais suivre les cours et m’entraîner afin d'acquérir des compétences dans le domaine, encore merci à vous et à bientôt.
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 26 avril 2018 à 21:14
Bonsoir Christophe,
Tu as oublié de remercier vb95 qui a grandement participé à la résolution de tes questions.
Merci de valider ce topic en utilisant la roue dentée en haut, à droite.

Bonne soirée et au prochain post !!!
Messages postés
16
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
18 mai 2018
- 26 avril 2018 à 21:21
En effet!! Honte à Moi, Merci vb95!!! of course

Bonne soirée à vous tous et à bientôt
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.