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
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 ?
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.
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?
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.
à 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 !
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
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 ???
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
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
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)
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 ???
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
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
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
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.
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"
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
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
# 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.
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
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 ?
En fait un csv Excel est séparé par des ; en raison du symbole décimal Français.
Le fait que les fichiers CSV soient essentiellement utilisés autour de logiciels tableur comme Microsoft Excel, et que les séparateurs ne soient pas standardisés (virgules, points-virgules sous certaines localisations dont la française, etc.) rend ce format peu pratique pour une utilisation autre que des échanges de données ponctuels. Ce format est toutefois assez populaire parce qu'il est relativement facile à générer.
Le format original est avec virgule, comme son nom l'indique "Comma Separated Values".
Ma version avec Linq et sans Stream
Dim aExporter As List(Of String) = (
From ligne In File.ReadAllLines("toto.csv")
Where ligne.Split(","c).Length = 12
Select ligne).ToList()
File.WriteAllLines("export.csv", aExporter)
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.
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.
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
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
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 !!!
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é.
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 )
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.
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.