Bonjour, je voudrais récupérer la 1ère ligne de mon premier fichier csv pour la réécrire sur mon nouveau fichier csv (en + des données de la période choisie mais ça c'est géré)
merci
Bonjour, je voudrais récupérer la 1ère ligne de mon premier fichier csv pour la réécrire sur mon nouveau fichier csv (en + des données de la période choisie mais ça c'est géré)
merci
Dans un fichier texte, tu ne peux pas remplacer juste une ligne, il faut réécrire tout le fichier. Le plus simple, si le fichier est assez petit, c'est de tout lire avec File.ReadAllLines, modifier la première ligne, et tout réécrire avec File.WriteAllLines. Si le fichier est plus gros, il faut boucler en faisant des ReadLine/WriteLine
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Merci le fichier est plutôt gros, est ce que tu peux me donner un petit exemple avec readline/writeline ?
en fait tu ne peux pas écrire dans un fichier que tu es en train de lire, il faut donc passer par un fichier temporaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Dim fileName As String = "leFichier.txt" Dim tmpFileName As String = fileName & ".tmp" Dim n As Integer = 0 Using reader As New StreamReader(fileName) Using writer As New StreamWriter(tmpFileName) Dim line As String = reader.ReadLine() If n = 0 Then ' C'est la première ligne, donc l'entête ' Modification de l'en-tête, à toi de voir ce que tu mets dedans... line = Traitement(line) End If n = n + 1 writer.WriteLine(line) End Using End Using ' Renommage du fichier File.Move(tmpFileName, fileName)
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Ok merci pour le code je pense que je vais m'en sortir maintenant, je te tiens au courant
Ca ne fonctionne pas il veut pas StreamReader tout seul alors je rajoute IO. devant mais ça ne marche toujours pas sinon ça bloque au niveau de la modification du fichier aussi
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Je crois que c'est le fait que j'avais pas mis "Imports System.IO" qui fesait tout beugé !
Mais ce n'est toujours pas bon, j'ai impossible de créer un fichier déjà existant à ce niveau là
Code : Sélectionner tout - Visualiser dans une fenêtre à part File.Move(tmpFileName, filename)
ah oui, il faut supprimer l'ancien fichier avant (ou le sauvegarder ailleurs) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 File.Delete(filename) File.Move(tmpFileName, filename)
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Merci toujours un problème cependant : Le processus ne peut pas accéder au fichier 'C:\Documents and Settings\Stagiaire\Bureau\prises.csv', car il est en cours d'utilisation par un autre processus.
Je te montre mon code au cas où :
-Déclaration des données :
- Code pour écrire l'entête et le nouveau fichier csv :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Dim filename As String = "C:\Documents and Settings\Stagiaire\Bureau\prises.csv" Dim fields As String() Dim delimiter As String = ";" 'caractère de séparation Dim ligne As String = "" Dim tmpFileName As String = filename & ".tmp" Dim n As Integer = 0 Dim JeGArde As New System.Text.StringBuilder Dim Newfilename As String = "c:\prises.csv" Dim Lect As New IO.StreamReader(filename) Dim Debut = CDate(D_Deb.Value.ToShortDateString) Dim Fin = CDate(D_Fin.Value.ToShortDateString) Dim cpt As Integer ligne = Lect.ReadLine Fin = Fin.AddDays(1) cpt = 0
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 If cpt > 0 Then Using reader As New StreamReader(filename) Using writer As New StreamWriter(tmpFileName) Dim line As String = reader.ReadLine() If n = 0 Then ' C'est la première ligne, donc l'entête ' Modification de l'en-tête, à toi de voir ce que tu mets dedans... writer.WriteLine(line) End If n = n + 1 writer.WriteLine(line) End Using End Using ' Renommage du fichier File.Delete(filename) File.Move(tmpFileName, filename) My.Computer.FileSystem.WriteAllText(Newfilename, JeGArde.ToString, False) MsgBox("Votre nouveau fichier a été créé !", MsgBoxStyle.OkOnly, "Fichier disponible") Process.Start("c:\prises.csv") 'ouverture du fichier après sa création Me.Close()
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Sur celle ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part File.Delete(filename)
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Le fichier est bien fermé par contre il est vrai qu'il y a un accès à filename plus haut pour garder seulement les données de la période choisie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ligne = Lect.ReadLine While ligne IsNot Nothing 'tant que je ne suis à la fin on continue fields = ligne.Split(delimiter) If fields.GetValue(1) = "PRI" And fields.GetValue(0) >= Debut And fields.GetValue(0) <= Fin Then 'si les colonnes n°1 et 2 (index de début = 0) correspondent à ma condition je la stocke" Then JeGArde.AppendLine(ligne) cpt = cpt + 1 End If ligne = Lect.ReadLine 'on passe à la ligne suivante End While End If
Lect est un StreamReader je suppose ? il faut que tu le refermes après usage, sinon le fichier reste bloqué. Le plus simple est d'utiliser un bloc Using comme j'ai fait
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
C'est bien un StreamReader pour le fermer, il me suffit d'écrire?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Lect.close()
Sinon je testerais avec le using
Edit : J'ai testé les 2 maintenant dans mon 1er fichier il ne garde plus que l'entête et dans le nouveau j'ai les données.
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
J'ai réussi à résoudre le problème en effectuant quelques modifications.
Merci pour ton aide
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager