IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

linq - ajouter index de ligne [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur STC, systèmes de supervision
    Inscrit en
    Juin 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur STC, systèmes de supervision
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 58
    Points : 59
    Points
    59
    Par défaut linq - ajouter index de ligne
    Bonjour à tous,

    Je souhaiterais ajouter un numéro de ligne dans un fichier texte grâce à la fonction linq...

    Pour le moment, je ne travail qu'avec deux variables :
    EntireText qui prend en mémoire le fichier texte
    NewText qui modifie EntireText pour mettre les 19 premiers caractères de chaque ligne sous forme d'une date
    (çà me permet ensuite de l'exploiter) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                EntireText = System.IO.File.ReadAllLines(openFile1.FileName)
                NewText = (From TheLines In EntireText
                           Select Convert.ToDateTime(LSet(TheLines, 19)) & Mid(TheLines, 20)).ToArray
    Je souhaiterais que la variable NewText prenne en plus l'indice de la ligne mais je ne vois pas trop comment faire...

    Le code suivant ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                NewText = (From TheLines In EntireText
                           Select MyLineNumber & " " & Convert.ToDateTime(LSet(TheLines, 19)) & Mid(TheLines, 20)).ToArray
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Public Function MyLineNumber() As Long
            If MyLineNumber = Nothing Then MyLineNumber = 0
            MyLineNumber = MyLineNumber + 1
            Return MyLineNumber
        End Function
    J'ai trouvé ce sujet qui pourrait aider mais je n'y arrive pas pour autant

    Merci d'avance!

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Tu peux utiliser la surcharge de la méthode Select proposée par LinQ To Object. Cela te permet de faire ceci :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim query = _
                fruits.Select(Function(fruit, index) _
                                  New With {index, .Str = fruit.Substring(0, index)})
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur STC, systèmes de supervision
    Inscrit en
    Juin 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur STC, systèmes de supervision
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 58
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Je te remercie mais je n'arrive pas à exploiter ta réponse...

    Je dois tout d'abord déclarer fruits (dim fruits as object ?!)
    Après quoi il me met un warning disant que fruits est utilisé avant qu'une valeur ne lui soit assignée.

    Puis quand je démarre le programme, il bugg sur cette ligne avec pour notif : "L'exception NullReferenceException n'est pas gérée - Variable objet ou variable d'un bloc With non définie."

    Tu pourrais m'en dire plus stp?

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur STC, systèmes de supervision
    Inscrit en
    Juin 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur STC, systèmes de supervision
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 58
    Points : 59
    Points
    59
    Par défaut
    Enfaite c'est bon, j'ai trouvé ta reference ;-)

    Merci

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur STC, systèmes de supervision
    Inscrit en
    Juin 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur STC, systèmes de supervision
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 58
    Points : 59
    Points
    59
    Par défaut
    J'ai réussi!

    C'est tiré par les cheveux mais çà marche!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                EntireText = System.IO.File.ReadAllLines(openFile1.FileName)
                'NewText = (From TheLines In EntireText
                '           Select Convert.ToDateTime(LSet(TheLines, 19)) & Mid(TheLines, 20)).ToArray
                Dim query = EntireText.Select(Function(EntireText, index) New With {index, EntireText})
                Dim output As New System.Text.StringBuilder
                For Each obj In query
                    output.AppendLine(RSet(obj.index, 6) & "     " & obj.EntireText)
                Next
                RichTextBox1.Text = output.ToString()
                NewText = RichTextBox1.Lines

    merci DotNetMatt de m'avoir mis sur la piste

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur STC, systèmes de supervision
    Inscrit en
    Juin 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur STC, systèmes de supervision
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 58
    Points : 59
    Points
    59
    Par défaut
    Par contre, si quelqu'un sait comment transformer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                RichTextBox1.Text = output.ToString()
                NewText = RichTextBox1.Lines
    en une ligne qui ressemblerait à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                NewText = output.ToString()
    mais qui marche (NewText est un tableau); je suis preneur!

    J'imagine qu'il faudra transformer l'intérieur de la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    output.AppendLine(RSet(obj.index, 6) & "     " & obj.EntireText)
    En attendant, je classe le sujet comme résolu =)

  7. #7
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    tu peux sans doute utiliser quelque chose dans ce goût là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    NewText = IO.File.ReadLines(openFile1.FileName).
        Select(Function(line, index) New With {Key index, Key line}).
        Aggregate(New List(Of String),
                  Function(list, item)
                      list.Add(String.Format("{0,6}     {1}", item.index, item.line))
                      Return list
                  End Function,
                  Function(list) list.ToArray)
    Aggregate sert à "construire" une valeur par accumulation, elle fonctionne ainsi, à partir d'une valeur initiale (ici new List(Of String)) on parcourt la collection (ici le résultat du select, soit une collection des index/lignes)) avec la valeur accumulée jusque là, et on renvoie la nouvelle valeur accumulée. Donc ici pour chaque couple index/ligne on les ajoute formatés à la liste et on la renvoie (on est obligé d'utiliser une lambda multiline car List.Add ne renvoie pas de valeur [on pourrait faire une méthode d'extension sur List pour cela]). le troisième paramètre d'Aggregate, sert à transformer l'accumulation finale en autre chose, ici on transforme la liste en tableau pour qu'elle soit du type de NewText ; on aurait pu s'en passer et directement faire un ToArray sur le résultat d'Aggregate.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Linq et Index de ligne pour condition
    Par shaun_the_sheep dans le forum C#
    Réponses: 2
    Dernier message: 04/10/2013, 13h18
  2. [Struts] Index de ligne dans 1 tableau
    Par javaSudOuest dans le forum Struts 1
    Réponses: 9
    Dernier message: 20/10/2005, 09h52
  3. [AbstractTableModel] ajout d'une ligne
    Par b_52globemaster dans le forum Composants
    Réponses: 7
    Dernier message: 29/07/2005, 13h09
  4. [debutant] [JTable] ajout d'une ligne
    Par lanfeustdetroll dans le forum Composants
    Réponses: 1
    Dernier message: 29/06/2005, 18h19
  5. [C#] Ajout d'une ligne dans un dataset
    Par frechy dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/12/2004, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo