Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Lire les dernières lignes d'un fichier texte.
#1
Je veux lire les 20 dernières lignes d'un fichier texte avec mon bot. Est-ce que c'est possible ?

Si oui, merci de me faire un exemple s'il-vous-plaît.
#2
moi, je ferais, mais ce n'est peut être pas la meilleur solution :


tcl
set recup ""
   set fichier1 "$nf"
   set liste10 [open $fichier1 r]
   while { [ eof $liste10 ] == 0 } {
      gets $liste10 info
      if { $info ne "" } {
         lappend recup $info
      }
   }
   close $liste10
   set recup [lrange $recup end-20 end ]

$nf étant le nom du fichier avec son chemin accès depuis la racine de l'eggdrop
la liste recup possède des 20 dernières lignes de ton fichier
#3
Si le fichier n'est pas trop gros (peut être stocké en mémoire), la solution rapide est (basée sur celle de jplyon1):

tcl
set fichier "ton_fichier"
set inf [open $fichier "r"]
set datas [split [read -nonewline $inf] "\n"]
close $inf
set datas [lrange $datas end-20 end]

Zeolia - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#4
Bonjour,

Merci pour vos réponses. J'ai essayé d'appliquer ce que vous m'avez donné comme exemple pour lire les 20 dernières lignes d'un fichier txt et çà fonctionne nickel.

Le seul soucis que j'ai maintenant, c'est quand je voulais utiliser cette méthode pour limiter des résultats que le bot m’envoie en notice quant il me répond à une commande X.

Voici donc le code que je veux modifier afin de limiter l'affichage des 20 dernières résultats trouvées dans un fichier txt.

Exemple:


Code:
[14:10:24] <~Owner> !connect Qqun
[14:10:24] <Notice> de Chorus ..:Liste des connexions:..
[14:10:24] <Notice> de Chorus  1 --> Qqun *.107.*.248 18/10/2011 19:43:33
...
[14:10:24] <Notice> de Chorus  20 --> Qqun *.28.*.199 18/12/2011 21:28:13
TCL

tcl
bind pub - !connect connects
    proc connects { nick host handle channel arg } {  
    global connects vhostnivconnect salonconnect connects
     foreach salonst $salonconnect {
      if {[string equal -nocase $salonst $channel]} {
      foreach vhost $vhostnivconnect {
      if [string match -nocase $vhost $host]  {
    if {$arg == ""} {
        putquick "NOTICE $nick :\00312- \0031Syntax \0036!connect pseudo/IP \00312-"
        return 0
    }
       putquick "NOTICE $nick :\0033..:Liste des connexions:.."
        catch {open "connect.txt" "r"} connexion
        set num 0
        set verif [split [read -nonewline $connexion] "\n"]
        set verif [lrange $verif end-20 end]
          while {![eof $connexion]} {
          gets $connexion verif
          if {$verif ne "" && [string match -nocase *$arg* $verif]} {
             incr num 1;
             putquick "NOTICE $nick :\0034 $num -->\0033 [lrange $verif end-20 end] \r"
          }
       }  
       catch {close $connexion}
       if {$num eq "0"} {putquick "NOTICE $nick :\0034Aucune connexion dans la base de donnée ! \r; return 0"}
       putquick "NOTICE $nick :\0033Fin de la Liste (\0034 $num \0033connexion(s) enregistré(s))";
       return 0
    }
    }
    }
    }

#5
Effectivement, tu as un souci de conception: tu remplis $verif avec les 20 dernières lignes de ton fichiers, mais ensuite tu boucles sur ton fichier, donc tu vas avoir toutes les lignes qui matchent le contenu des 20 dernières lignes (???)...

Voici quelque chose qui me semble plus cohérent:

tcl
bind pub - !connect connects
 
proc connects { nick host handle channel arg } {  
   global connects vhostnivconnect salonconnect connects
   foreach salonst $salonconnect {
      if {[string equal -nocase $salonst $channel]} {
         foreach vhost $vhostnivconnect {
            if [string match -nocase $vhost $host]  {
               if {$arg == ""} {
                  putquick "NOTICE $nick :\00312- \0031Syntax \0036!connect pseudo/IP \00312-"
                  return 0
               }
               putquick "NOTICE $nick :\0033..:Liste des connexions:.."
               catch {open "connect.txt" "r"} connexion
               set res {}
               while {![eof $connexion]} {
                  gets $connexion verif
                  if {$verif ne "" && [string match -nocase *$arg* $verif]} {
                     lappend res $verif
                  }
               }
               catch {close $connexion}
               if { [llength $res] == 0 } {
                  putquick "NOTICE $nick :\0034Aucune connexion dans la base de données !"
                  return 0
               } elseif {[llength $res] >=20} {
                  set res [lrange $res end-20 end]
               }
               set num 0
               foreach line $res {
                  incr num
                  putquick "NOTICE $nick :\0034 $num -->\0033$line"
               }
               putquick "NOTICE $nick :\0033Fin de la Liste (\0034 $num \0033connexion(s) enregistré(s))"
            }
         }
      }
   }
}

Zeolia - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away


Possibly Related Threads…
Thread Author Replies Views Last Post
  Auto voice après X lignes Scorpio 1 3,249 04/02/2016, 00:57
Last Post: BaGrift
  [Résolu] récupérer texte dans page html BrYcOu 5 5,697 22/09/2015, 06:46
Last Post: BrYcOu
  Commenter des lignes de code TCL fait tout bug.. aliasangelius 2 3,974 05/09/2012, 11:54
Last Post: aliasangelius
  Script servant à lire le contenu d'un fichier texte KiBa 4 5,932 07/03/2012, 16:14
Last Post: KiBa
  Detecter Flood texte DnS 7 5,123 05/12/2010, 19:01
Last Post: DnS
  Flood texte a repetition bewess 13 9,234 04/12/2010, 22:51
Last Post: lesny
  Découpage de texte MenzAgitat 6 5,769 05/02/2010, 00:43
Last Post: MenzAgitat
  besoin d'aide pour lire des pages html loulou7593 2 4,567 03/08/2009, 18:37
Last Post: loulou7593
  Lire une ligne précise sur une page html BdS 7 7,893 03/10/2006, 21:58
Last Post: BdS

Forum Jump:


Users browsing this thread: 1 Guest(s)