PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TCL: Programm zum Wörter, Zeilen... zählen


AngelNights
12.01.2005, 11:24
Hallöchen.

Bin noch neu hier. Also hallo erstmal. ^^

Also ich hab ein Problem. Und zwar erstelle ich mit TCL gerade ein Programm, was die Wörter, Zeilen und Bytes zählen. Allerdings komme ich gerade nicht weiter. Das er mir die Anzahl der Wörter in einer Reihe ausgibt habe ich schon geschafft. Allerdings müssten diese nun zusammengezählt werden, so dass ich zum Schluss nicht mehrere Zahlen angezeigt bekomme, sondern nur eine: die Gesamtzahl. Kann mir einer sagen, wie ich das machen kann? Vermutlich ist es nicht mal schwer nur ich komm nicht drauf. ^^'


proc ablauf {name} {
set f [open $name r]
# öffnen einer Datei
set zz 0
while { [gets $f zeile] >= 0} {
incr zz
set list [split $zeile]
# splitten einer datei
set y [llength $list]
# länge der liste zählen
puts $y
set x [file size $name]
# größe der datei
}
puts [format "%3s %5d" $zz $x]
# ausgeben der Ergebnisse
close $f
}


Das ist so das was ich schon mal habe. ^^
Dann soll aber noch "argv" dazu kommen, das mit foreach gemacht wird.
Bsp.: foreach var $argv
Kann mir auch hier jemand helfen, wie das funzt? Wäre sehr dankbar für eure Hilfe.

AngelNights


ChaosKrieger
12.01.2005, 14:06
hi,

ich verstehe das soweit das du die sachen zusammen rechnen möchtest?

wenn ja, geht das mit expr
expr 2 + 3

zu deiner forache, das machste so..


foreach var [was auch immer du vorhast] {
...
}


By Chaos

AngelNights
19.01.2005, 12:37
Danke. Ich wollte es jedoch anders berechnen. Habe halt die Zahlen mit Variablen ersetzt.
So habe ich das gemacht:


set summe [expr {$summe + $y}]

Dann sieht mein Programm so aus:

proc ablauf {name} {
set f [open $name r]
# öffnen einer Datei
set zz 0
set summe 0
set insgesamt 0
while { [gets $f zeile] >= 0} {
incr zz
set list [split $zeile]
# splitten einer datei
set y [llength $list]
# länge der liste zählen
set summe [expr {$summe + $y}]
set x [file size $name]
# größe der datei
set u [file nativename $name]
}
puts [format "%4s %5d %5d %8s" $zz $summe $x $u]
# ausgeben der Ergebnisse
close $f
}
# set argv {v1 v2 v3 v4 v5}
foreach var $argv {
ablauf $var
}


Allerdings ist mir das noch zu ungenau. Wenn ich es mit dem Programm WC vergleiche sind Unterschiede vorhanden.
Wie kann ich es machen, das mir mein Programm keine leeren Zeilen lies? Ich weiß, das ich es mit einer if, then, else machen kann. Aber wie? Kann mir das jemand anhand meines Beispieles vorgeben?
Bei den Wörter zählen ist es genau so.
Und dann noch was. Wenn ich mehrere Texte mit meinem Programm einlesen lasse und die Ergebnisse dann bekomme, wie kann ich es machen, das er mir zum Schluss alles zusammenrechnet? Sprich "Insgesamt?
Das Ergebnis soll dann in etwas so aussehen:
25 103 539 schleife1.tcl
15 45 282 schleife2.tcl
41 179 839 schleife.tcl
11 53 232 zeilen.tcl
92 380 1892 insgesamt
Wie kannich das machen?

ChaosKrieger
20.01.2005, 10:49
hi, also das mit den leerzeichen würde ich mit foreach machen.. bei \n spliten und dann mit if schaun, ob leer oder nicht..