Visual Basic Express - Mise en forme fichier CSV

Résolu
christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 18 mai 2018 - 25 avril 2018 à 16:25
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 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

8 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 25 avril 2018 à 17:58
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 ?

0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
25 avril 2018 à 17:56
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.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 25 avril 2018 à 18:25
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?
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
Modifié le 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.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 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 !
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
25 avril 2018 à 18:35
à la place de TRAINBUS plutôt
c'est exact
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
25 avril 2018 à 20:56
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
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 25 avril 2018 à 22:27
Salut
à toi cs_JMO
Avec le nombre d'éléments cela marche aussi
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
25 avril 2018 à 22:15
Bonsoir vb95,
La prochaine question de christophe68_is devrait être :
comment recréer le .csv ???

Bonne soirée.
0
christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 18 mai 2018
25 avril 2018 à 23:31
hello,

Exact :-)

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


Donc si je lis le code, je compte les séparateurs, "," dite moi si je me trompe. Sur la colonne 12, il n'y a plus de "'," fin de la ligne.
Je renvois le numéro de la ligne, comment je vais recréer le CSV, c'est en effet ma prochaine question... ( il faut bien débuter ).

"j'adore l'anticipation"

Bonsoir vb95,
La prochaine question de christophe68_is devrait être :
comment recréer le .csv ???

Encore merci pour votre support!
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 18 mai 2018
Modifié le 25 avril 2018 à 23:56
Bonsoir !
Où as-tu vu que l'on compte les séparateurs ?
Où as-tu vu un numéro de ligne renvoyé ?

Dim readText() As String = File.ReadAllLines(myfilecsv)  ' les lignes du fichier
Dim currentline As String 
For Each currentline In readText  ' pour chaque ligne du fichier 
Dim arrayline As String() = currentline.Split(",") ' les éléments de cette ligne ( on ne compte pas les séparateurs )
If arrayline.Count = 12 Then ' si il y a 12 éléments on garde la ligne  
MessageBox.Show(currentline) ' c'est une String et non un numéro de ligne
End If 
Next 


Pour recréer le fichier utilise
File.WriteAllLines
en créant un tableau avec les lignes gardées

Un excellent cours pour débuter en VB Net : https://plasserre.developpez.com/cours/vb-net/

Pour poster du code utilises les balises de code :https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
0
christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 18 mai 2018
Modifié le 26 avril 2018 à 11:27
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
0
christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 18 mai 2018
25 avril 2018 à 20:57


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
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
25 avril 2018 à 21:08
Dans ce cas, la solution de Jean-Marc (salut au passage) est la bonne.
0

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

Posez votre question
christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 18 mai 2018
Modifié le 26 avril 2018 à 13:53
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:
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 26 avril 2018 à 16:01
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"
0
christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 18 mai 2018
26 avril 2018 à 16:11
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
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 26 avril 2018 à 16:22
C'est une solution mais avec les balises de code ce serait mieux
voici la mienne
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim Lignes As List(Of String) = File.ReadAllLines("D:\Test.txt").ToList
        For i = Lignes.Count - 1 To 0 Step -1
            If Lignes(i).TrimEnd.EndsWith("N") = True Then Lignes.RemoveAt(i)
        Next
        File.WriteAllLines("D:\Test.txt", Lignes)

    End Sub


Si ton problème est résolu ferme la discussion avec la roue dentée au debut du message pour le mettre "en Résolu"
Merci
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
26 avril 2018 à 16:52
# Christophe,
Tu parles input et output file "*.csv". Or, je vois "C:\test\Testfile.txt".
Comme demandé par vb95, comment créés-tu ton fichier "c:\test\imput.csv" ???

# vb95
Code fonctionnel si "N" est validé par Christophe. Nous ne connaissons pas son appli et donc les datas extraites.

Quant à moi, j'en étais resté à
        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)
            Dim readText() As String = File.ReadAllLines(inputfile)
            For Each currentline As String In readText
                If currentline(currentline.Length - 1) <> ";" Then
                    sw.WriteLine(currentline)
                End If
            Next
        End Using

Le fichier outputfile s'ouvre "colonné" avec Excel.
Le hic, c'est la définition du délimiteur.

jean-marc
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
26 avril 2018 à 17:29
Salut Jean-Marc
Pour le "N" j'ai compris
Il correspond à la colonne Frigo de la DataGridview ( N = non frigorifique et O = frigorifique je suppose)
Donc ce serait mieux de passer par le nombre d'éléments ( 11 si on supprime la ligne )

voici le nouveau code
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim Lignes As List(Of String) = File.ReadAllLines("D:\Test.txt").ToList
        For i = Lignes.Count - 1 To 0 Step -1
            Dim Elements as List(of String) = Lignes(i).Split(","c).ToList
            If Elements.Count = 11 Then Lignes.RemoveAt(i)
        Next
        File.WriteAllLines("D:\Test.txt", Lignes)

    End Sub
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
26 avril 2018 à 18:31
Re-hello vb95 !!!

Est-ce que ton script fonctionne avec un fichier .csv ???

avec inputfile="Test.csv"
            For Each currentline As String In File.ReadAllLines(inputfile)
                Debug.Print(currentline)
, j'obtiens
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 ;


Info pour Christophe :
vb95 a mis
For i = Lignes.Count - 1 To 0 Step -1
pour lire le fichier à partir de la fin jusqu'au début. Cela permet la suppression de lignes.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 26 avril 2018 à 19:05
Salut Jean-Marc

Je viens de vérifier sur Google : le séparateur d'un fichier .csv est la virgule et non le point-virgule
Un fichier .csv n'est qu'un fichier texte formé de différentes lignes dont les éléments sont séparés par des virgules
Mon code fonctionne nickel ( j'ai testé avec un fichier .csv que j'ai ouvert avec Excel avant et après transformation )
Quel est ton souci exactement ?
0
christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 18 mai 2018
26 avril 2018 à 16:16
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é.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 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 )
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
26 avril 2018 à 17:56
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.
0
christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre 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.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre 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 !!!
0
christophe68_is Messages postés 16 Date d'inscription mercredi 25 avril 2018 Statut Membre 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
0
Rejoignez-nous