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


Extraction de données d'un fichier txt en TCL
#1
je souhaiterai récupérer une partie d'un texte dans un fichier txt
qui se présente comme le fichier attachés (Display.txt) :

Je souhaite d'abord lire le fichier ligne par ligne et puis je souhaite afficher des informations comme :

Vlan : 1
Nombre de ports total : 20
Nombre de ports connecté : 2
Nombre de ports nonconnecté : 18
Liste de ports connectés : Gi1/0/1,Gi1/0/2
List de ports nonconnectés : Gi1/0/3,Gi1/0/4,Gi1/0/5,Gi1/0/6,Gi1/0/7,Gi1/0/8,Gi1/0/9,Gi1/0/11,Gi1/0/12,Gi1/0/13,Gi1/0/17,Gi1/0/18,Gi1/0/19,Gi1/0/20,Gi1/0/25,Gi1/0/26,Gi1/0/27,Gi1/0/28

*********

Vlan : 2
Nombre de ports total : 5
Nombre de ports connecté : 2
Nombre de ports nonconnectés : Gi1/0/10,Gi1/0/21
List de ports nonconnectés : Gi1/0/22,Gi1/0/23,Gi1/0/24

Quelqu'un a une idée pour faire ça?

Merci.
#2
Déjà, pour lire le fichier:


tcl
set fileID [open "display.txt"]
set fileData [read $fileID]
set fileLines [split $fileData "\n"]
foreach line $fileLines {
  # Ici traitement de la variable line qui contient le ligne
}


C'est un début, à toi de voir pour la suite Smile
#3
bonjour,

j'aimerais assigner à une variable tcl les différentes valeurs d'un fichier .txt (il y a une valeur par ligne).
Dans mes recherches je suis tombé sur ce post, j'ai repris le code proposé mais n'arrive pas à mes fins.
Je ne parviens pas à assigner à chaque variable la valeurs de la ligne du fichier.
Les seuls résultats auxquels j'arrive sont soit la dernière valeur du fichier texte dans la ou les variables avec le code suivant :


tcl
set fileID [open "config/confProg.txt"]
	set fileData [read $fileID]
	set fileLines [split $fileData "\n"]
	foreach line $fileLines {
		lappend nbVoiles $line
                etc..
	}


Soit en affichant directement fileLines ou fileData, j'ai toute les valeurs contenue dans le fichier (en ligne ou en colonne selon que je prend fileLine ou fileData)

Pourrait-on m'indiquer le moyen "d'isoler" chaque ligne du fichier .txt svp ?

Merci
#4
Dans ta boucle foreach, $line contient la ligne que tu traites actuellement.
#5
En fait j'ai trouvé une autre solution, je récupère la valeur qui m'intéresse avec la fonction lindex

tcl
set ::nbVoiles [lindex $fileLines 0]

Mais dans le cadre de la structure que tu proposes, je vois pas trop comment faudrait faire (c'est pas pure curiosité la vu que j'ai résolu mon pb), peut-être quelque chose comme :
tcl
if $line == i set nbVoiles $line

dans la boucle foreach ? (ou i est la ligne qui m'intéresse)
#6
En effet, c'est une idée. Mais utiliser lindex est la meilleure solution, puisqu'elle t'évite de parcourir toute la liste. Je n'avais pas compris que tu ne voulais lire qu'une seule ligne. T'as trouvé la solution tout seul!

Afin d'éviter tout problème, je t'invite à prendre une bonne habitude qui consiste à vérifier que la ligne numero X existe bien:


tcl
if {[llength $filesLines] < X} {
    putlog "Error: WTF! Impossible de récupérer la ligne X puisque le fichier ne contient pas X lignes !"
    return
}


Ou plis simplement:


tcl
if {[lindex $filesLines X] == ""} {
    ...
}

#7
Euh non en fait je lis chaque ligne, donc je répète 8 fois la commande lindex avec une valeur différente à chaque fois (mon fichier texte comporte 8 valeurs) que j'assigne à une variable différente à chaque fois.

Merci pour le conseil pour la vérification de la "taille" du fichier lu.
#8
Dans ce cas tu devrais jeter un coup d'oeil à la command lassign. Uniquement pour Tcl 8.5, mais tu peux écrire une version pour Tcl 8.4 facilement.


tcl
lassign $fileLines ligne_1 ligne2 ligne_3 ...

#9
C'est exactement ce qu'il me fallait :)

Merci
#10
on peut integrer ce code en php ?


Forum Jump:


Users browsing this thread: 1 Guest(s)