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

Tcl/Tk Discussion :

Lignes identiques dans un fichier


Sujet :

Tcl/Tk

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2015
    Messages : 35
    Points : 24
    Points
    24
    Par défaut Lignes identiques dans un fichier
    Bonjour,

    Voici un exemple de mon fichier texte :
    REC,0,5,81,1203
    REC,0,5,81,1203
    REC,0,5,81,1209.2
    REC,0,5,81,1209.2
    REC,0,5,81,1207.2
    REC,0,5,81,1206.2
    ...

    Dans ce fichier je souhaiterais y insérer un saut de ligne à chaque fois que ma ligne est différente de
    la précédente .

    En TCL , je ne sais pas comment faire pour enregistrer la ligne et la comparer à la suivante

    Dans mon exemple seul le dernier élément change et je souhaiterai comparer avec ce dernier

    Merci de votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set fichier [open $statusfile r]
    set new [open $newfile w+]
     
    while {![eof $fichier]} {
     
    set ligne [gets $fichier]
    set data [ string match {*REC,*} $ligne]
     
    if {$data == 1 } {
    set ligne [split $ligne ","]
    set data [lindex $ligne end]
    }
     
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 528
    Points
    528
    Par défaut
    Bonsoir,

    Une solution possible est la suivante :
    - Ouvrir et lire le fichier statusfile
    - Spliter le contenu dans une liste
    - Ouvrir le fichier newfile
    - Parcourir la liste dans une boucle en comparant avec l'élément précédent
    - Si deux éléments consécutifs sont différents alors écrire un saut de ligne dans le fichier newfile sinon écrire les éléments de la liste

    Ce qui donne en Tcl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    set fp [open $statusfile r]
    set fd [read $fp]
    close $fp
    set l [split $fd "\n"]
    set lo [lindex $fd 0]
    set fp [open newfile w]
    puts $fp $lo
    foreach line [lrange $l 1 end] {
           if ![string equal $line $lo] {puts $fp ""}
           puts $fp $line
           set lo $line
    }
    close $fp
    ----
    canvas

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2015
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    merci beaucoup de votre réponse et suivant l'exemple que je vous ai donné cela marche parfaitement .

    Dans mon fichier texte, j'ai parfois des lignes qui peuvent s'insérer et ma ligne REC peut elle aussi changer .
    Je voudrai vraiment contrôler cette ligne et ne pas tenir compte des autres.
    La seul chose qui est consécutif dans ces lignes "REC" c'est le dernier élément .
    ex :
    REC,0,5,81,1203
    REC,0,5,99,1203
    PAUSE
    REC,0,5,81,1209.2
    STOP
    REC,0,5,101,1201
    REC,0,5,102,1201
    REC,0,5,99,1203
    STOP
    ...

    En reprenant mon code et votre exemple :

    J'ai essayé d'insérer la commande foreach
    mais sur ma console j'ai cette erreur sur la ligne foreach : "invalid command name"

    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
    set fichier [open $statusfile r]
    set new [open $newfile w+]
     
    while {![eof $fichier]} {
     
    set ligne [gets $fichier]
    set data [ string match {*REC,*} $ligne]
     
    if {$data == 1 } {
    set valeur [split $ligne ","]
    foreach line [[lindex $valeur end]] {
     
    # mon code pour comparer 
    }
    }
    }
    Merci de votre soutien

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 528
    Points
    528
    Par défaut
    Bonsoir,

    Si je reprends déjà la solution proposée, il suffit de filtrer la liste l pour éliminer les mots-clefs PAUSE ou STOP avant de la parcourir avec la boucle foreach en comparant cette fois-ci le dernier morceau de la ligne après la virgule au lieu de la ligne complète.
    Ce qui nous donne :

    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
     
    set fp [open $statusfile r]
    set fd [read $fp]
    close $fp
    set l [split $fd "\n"]
    set l [lsearch -all -inline -not -exact $l PAUSE]
    set l [lsearch -all -inline -not -exact $l STOP]
    set lo [lindex $fd 0]
    set fp [open newfile w]
    puts $fp $lo
    foreach line [lrange $l 1 end] {
           if ![string equal [lindex [split $line ","] end] [lindex [split $lo ","] end]] {puts $fp ""}
           puts $fp $line
           set lo $line
    }
    close $fp
    ----
    canvas

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2015
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    bonjour,

    en filtrant , je supprime les lignes , je souhaite les conserver malgré tout de sorte que mon fichier de sortie ressemble à ça :
    REC,0,5,81,1203
    REC,0,5,99,1203
    PAUSE
    [saut de ligne]
    REC,0,5,81,1209.2
    STOP
    [saut de ligne]
    REC,0,5,101,1201
    REC,0,5,102,1201
    [saut de ligne]
    REC,0,5,99,1203
    STOP

    Merci d'avance pour votre aide

  6. #6
    Membre à l'essai
    Homme Profil pro
    -
    Inscrit en
    Novembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Novembre 2015
    Messages : 8
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    En faisant comme ça, ça marche avec vos exemples :

    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
    set fin [open in.txt r]
    set fout [open out.txt w]
    unset -nocomplain lastdiff
    while {![eof $fin]} {
    	set line [gets $fin]
    	set diff [lindex [split $line ,] end]
    	if {![info exists lastdiff]} {
    		puts $fout $line
    		set lastdiff $diff
    	} elseif {[string range $line 0 2] eq "REC" && $diff ne $lastdiff} {
    		puts $fout \n$line
    		set lastdiff $diff
    	} else {
    		puts $fout $line
    	}
    }
    close $fin
    close $fout

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2015
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    merci pour la solution

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 03/09/2012, 21h51
  2. Réponses: 4
    Dernier message: 08/05/2012, 11h58
  3. Supprimer lignes identiques dans un fichier
    Par Gad29 dans le forum Langage
    Réponses: 19
    Dernier message: 30/05/2007, 16h09
  4. Réponses: 4
    Dernier message: 02/07/2004, 20h14
  5. Réponses: 6
    Dernier message: 04/03/2004, 10h35

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