Copier une partie du contenu d'un fichier dans un autre fichier

cs_jvkd59 Messages postés 1 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 17 septembre 2010 - 17 sept. 2010 à 17:45
 Utilisateur anonyme - 19 sept. 2010 à 19:54
Bonjour
Voici mon problème :
J'ais un fichier.csv (fichier texte organisé) sous le format :
date, numéro de client, nom du client, nom du produit, quantité, unité, prix, code vendeur (le fichier est classé de la date la plus ancienne à la date la plus récente).
Ce que je voudrais faire c'est :
L'utilisateur choisi une date et que lorsqu'il valide son choix, il faudrait rechercher cette date dans le fichier, si il ne la trouve pas, chercher la date suivante (le jour suivant) jusqu'à ce qu'il la trouve et alors copier toutes les lignes (de cette ligne à la dernière ligne) dans un autre fichier .csv.
Je ne vois pas comment faire cela.
Avez vous une idée ?
Merci d'avance.

2 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 sept. 2010 à 00:05
Salut
chaque item de ton fichier csv est séparé par une virgule ou autre ponctuation ?
je pense qu'il faudrait lire tout le fichier
et utiliser le split
déclarer un structure comme le fichier cvs
Private Structure mydata
public ladate as string
public nclient as string
...
End Structure

déclarer un vecteur dynamique du type mydata
private list() as mydata
une sub qui va lire le fichier et en utilisant le split mettre chaque item dans list()
l'utilisateur choisi une date
je cherche dans list()
tu as écrit
il ne la trouve pas, chercher la date suivante (le jour suivant) jusqu'à ce qu'il la trouve
je n'ai pas compris s'il ne la trouve pas
pourquoi il la trouverait
ce ne qu'un début il faut écrire le code
la théorie à part la pratique à part
0
Utilisateur anonyme
19 sept. 2010 à 19:54
Salut,
On peut aussi utiliser les collections triées.
Elles sont pratique dans ton cas puisqu'elles vont trier les dates par ordre croissant et ainsi faciliter la recherche.
J'ai adapté un bout de code pour ton problème :

        'date à rechercher (année , mois, jour) (c'est un exemple)
        Dim DateRecherche As New Date(2010, 4, 7)
        'stockage du titre
        Dim titre As String

        'nouvelle collection triée
        Dim col As New Collections.SortedList
        'ouverture du flux pour lecture (en admettant que monfichier.csv soit dans le repertoire de l'application)
        Using f As IO.StreamReader = New IO.StreamReader(Application.StartupPath & "\monfichier.csv")
            'lecture du titre (entetes des colonnes)
            titre = f.ReadLine()
            'lecture du fichier complet
            Do While Not f.EndOfStream
                Dim txt As String = f.ReadLine
                'extraction de la colonne de date qui servira de clef de tri pour la collection
                'dans ton exemple les dates sont sur la colonne 0 (dans ton cas le séparateur est la virgule)
                'le c signifie que le split est un Char
                Dim info As String = txt.Split(","c)(0)
                'date lue dans le fichier
                Dim d As Date
                'on essaie de parser la date (attention au format américain qui met le mois 
                'et le jour dans l'autre sens)
                If Date.TryParse(info.Trim, d) = True Then
                    'comme on peut voir la date (d) sert de clef de tri et txt est la ligne complète à stocker dans la collection
                    col.Add(d, txt)
                End If
            Loop
        End Using
        'ouverture du flux pour ecriture
        Using f As IO.StreamWriter = New IO.StreamWriter(Application.StartupPath & "\resultat.csv", False, System.Text.Encoding.Default)
            'ecriture du titre
            f.WriteLine(titre)
            'element contiendra la ligne à écrire
            Dim element As String
            'pour chaque item de la collection on compare la clef à la date à rechercher
            'si elle est supérieure ou égale on écrit dans le flux la ligne complète stockée dans la collection
            For x = 0 To col.Count - 1
                If col.GetKey(x) >= DateRecherche Then
                    element = DirectCast(col.Item(col.GetKey(x)), String)
                    f.WriteLine(element)
                End If
            Next
        End Using


Bonne nuit.
0
Rejoignez-nous