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.
Répondre Avertir
#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
Répondre Avertir
#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]


Répondre
#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
    }
    }
    }
    }


Répondre Avertir
#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))"
            }
         }
      }
   }
}


Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté