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 :

Comment renuméroter certaines lignes de fichiers txt fusionné.


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut Comment renuméroter certaines lignes de fichiers txt fusionné.
    Bonjour,

    Je fusionne une vieille collection de fichiers séquentielles (type *.txt ou * a une valeur de 0 à 100 par exemple) en un seul fichier destination par exemple z.txt.

    Pour cela j'utilise le petit programme suivant que je viens d'écrire sur console:

    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
    21
    22
    23
    Imports System
     
    Module Program
        Sub Main()
     
     
            Dim linesFromFile1() As String
            Dim combinedLines As New List(Of String)
     
            For n = 0 To 100
                linesFromFile1 = IO.File.ReadAllLines("F:\TEST\" + Mid(Str(n), 2) + ".ech")
     
                For linePos As Integer = 0 To System.Math.Max(linesFromFile1.Length, linesFromFile1.Length) - 1
                    combinedLines.Add(linesFromFile1(linePos))
                Next
     
            Next
     
            IO.File.WriteAllLines("F:\TEST\Z.ech", combinedLines.ToArray())
     
        End Sub
     
    End Module
    Nota : L'inter-code + Mid(Str(n), 2) + est nécessaire sinon la recherche se fera sur " 0.txt" et non "0.txt" ! et échouera donc.

    Pour faire simple, ces fichiers séquentielles sont tous composés de fiches sur 3 lignes chacune avec en première position le numéro d'ordre 1 ,2 , 3 etc. Donc toutes les trois lignes on a une nouvelle fiche. Exemple :

    ligne 1 : 1
    ligne 2 : Blabla
    ligne 3 : etc

    ligne 4 : 2
    ligne 5 : Chat
    ligne 6 : souris

    ligne 7 : 3
    etc.

    Mais en pratique c'est un peu n'importe quoi au niveau de l'ordre de mes fichiers d'origines 0.txt, 1.txt .... Il me faut modifier chronologiquement ces lignes de numéro peu importe le numéro qu'ils avaient au début. C'est déjà bien de ne pas avoir à les réorganiser !

    Il me faut donc renuméroter les lignes 1 (modulo 3 pour les matheux) 4 , 7 , 10 , 13 etc avec un numéro d'ordre 1, 2, 3, 4 ...

    Je pensais en utilisant ReadAllLines y arriver facilement en même temps que je cré z.txt. Malheureusement je n'ai pas trouvé l'astuce.

    Si vous avez une idée je suis preneur.

    En vous remerciant par avance

  2. #2
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    L'opérateur Mod est une bonne alternative. Il existe une différence entre le reste et le module en mathématiques, avec des résultats différents pour les nombres négatifs. Ceci n'est pas notre problème ici !

    Voici une solution mais je pense qu'il y a mieux !

    J'ai continué mes recherches et j'utilise le fichier Z.txt pour le convertir en X.txt avec la renumérotation.

    Le résultat est bien obtenu dans X.txt

    Bienvenu à vos commentaires :

    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
    21
    22
    23
    24
            Dim linesFromFile2() As String
            Dim combinedLines As New List(Of String)
            Dim combinedLines2 As New List(Of String)
     
            For n = 0 To 100
                linesFromFile1 = IO.File.ReadAllLines("F:\TEST\" + Mid(Str(n), 2) + ".txt")
     
                For linePos As Integer = 0 To System.Math.Max(linesFromFile1.Length, linesFromFile1.Length) - 1
                    If linePos Mod 3 = 0 Then linesFromFile1(linePos) = linePos / 3
                    combinedLines.Add(linesFromFile1(linePos))
                Next
            Next
               'résultat provisoire dans Z.txt
            IO.File.WriteAllLines("F:\TEST\Z.txt", combinedLines.ToArray())
     
            'renumérotage en mode chrono
            linesFromFile2 = IO.File.ReadAllLines("F:\TEST\Z.txt")
     
            For linePos As Integer = 0 To System.Math.Max(linesFromFile2.Length, linesFromFile2.Length) - 1
                If linePos Mod 3 = 0 Then linesFromFile2(linePos) = linePos / 3
                combinedLines2.Add(linesFromFile2(linePos))
            Next
    'résultat dans :
            IO.File.WriteAllLines("F:\TEST\X.ech", combinedLines2.ToArray())

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 552
    Par défaut
    Qu'est-ce que tu as besoin de renuméroter ? je ne suis pas sûr d'avoir bien compris
    Par exemple dans 0.txt tu peux avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    100
    blabla01
    blabla02
    dans 1.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    50
    blabla11
    blabla12
    et dans 2.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    13
    blabla21
    blabla23
    et au final dans ton fichier Z.txt, tu veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    0
    blabla01
    blabla02
    1
    blabla11
    blabla12
    2
    blabla21
    blabla22
    Si c'est ça pourquoi ne pas utiliser ton i pour nommer à la volée les blocs ? (ou si les fichiers contiennent plus d'un bloc, un autre numérateur)
    en sautant les lignes initiales d'index

    PS sinon à la place de Mid(str(n),2), il est plus simple d'utiliser Trim(Str(n)), Trim retirant tous les espaces à droite et à gauche d'une chaine.
    Je ne sais pas trop pourquoi tu utilises la fonction max, readalllines te lit toutes les lignes du fichier, donc tu te retrouves avec un tableau/liste des lignes; éventuellement tester si la ligne est vide.

  4. #4
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Bonjour umfred,

    Merci pour tes observations.

    1/ Pour l'indexation tu a bien résumé mon besoin.

    2/ Pour la fonction Trim c'est OK et c'est plus lisible bien sur. J'avais oublié cette instruction.

    3/ La méthode ReadAllLines lit bien sur toutes les lignes mais ne retourne pas la position de la dernière ligne nécessaire pour la boucle au format Integer d'où le besoin de l'identifie avec Max. Mais effectivement il semble possible d'écrire cette opération sans utiliser Max :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           Dim s As String
            For Each s In linesFromFile1
                Console.WriteLine(s)
            Next
    Est-ce bien cela ton idée ?

    A+

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 552
    Par défaut
    linesFromFile1.Length contient le nombre de lignes lues (nombre d'élément de linesFromFile1)
    De plus tu prends le Max de 2 fois la même valeur, donc inutile ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Math.Max(linesFromFile1.Length, linesFromFile1.Length)
    le For Each aussi peut être utilisé, si tu n'as pas besoin de la variable d'itération (et que tu ne modifies pas le tableau en cours de boucle)

  6. #6
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Bonsoir,

    Tu ne peut pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Math.Max(linesFromFile1.Length)
    sans déclencher une erreur puisque la méthode compare deux variables par définition. Donc l'astuce est de comparer deux fois la même variable.

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

Discussions similaires

  1. Comment écarter certaines lignes d'un fichier ?
    Par Eddoul dans le forum Unix
    Réponses: 7
    Dernier message: 22/03/2023, 14h06
  2. [PowerShell] Comment récupérer certaines lignes d'un fichier pour ensuite s'en servir
    Par Zipper963 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 13/12/2012, 15h35
  3. Comment ignorer certaines lignes d'un fichier
    Par Popeye63 dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/11/2012, 15h54
  4. Comment mettre certaines lignes gras dans un fichier EXCEL
    Par ludo35 dans le forum ODS et reporting
    Réponses: 8
    Dernier message: 05/05/2011, 14h49
  5. Réponses: 5
    Dernier message: 27/02/2006, 09h14

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