我有一个包含以下数据的文件
Anny : dancing Sonny : reciting Joel : dancing Anny : reciting Anny : singing
我想在tcl中使用以下o / p:
Anny - singing 1 dancing 1 reciting 1 Joel - dancing 1
我想以这种格式打印他们的计数。
答案 0 :(得分:1)
这真的关于计算单词,所以我们将要处理字典 - dict incr
是一个完美的工具 - 但你还需要做一些解析。解析以多种方式完成,但在这种情况下scan
可以轻松地完成我们想要的操作。 (请记住,在阅读我的代码时,scan
的结果是它设法满足的字段数。)
set f [open "yourinputfile.txt"]
set data [split [read $f] "\n"]
close $f
# Peel apart that data
foreach line $data {
if {[scan $line "%s : %s" who what] == 2} {
dict incr activity($who) $what
}
}
# Now produce the output
foreach who [lsort [array names activity]] {
puts "$who -"
dict for {what count} $activity($who) {
puts "$what $count"
}
# And the extra blank line
puts ""
}
答案 1 :(得分:1)
使用Donal的答案,但使用单个字典而不是字典数组:
set data [dict create]
set f [open yourinputfile.txt r]
while {[gets $f line] != -1} {
if {[scan $line "%s : %s" who what] == 2} {
dict update data $who activities {
dict incr activities $what
}
}
}
close $f
dict for {who activities} $data {
puts "$who -"
dict for {what count} $activities {
puts "$what $count"
}
puts ""
}
答案 2 :(得分:0)
您可以使用数组存储您收集的信息。
您正在使用的 regexp 是错误的。
使用列表列表以成对方式收集匹配(即单词#n),然后将所有收集的匹配分配给数组上的正确键。
以下是如何操作的示例:
set file_content {Anny : dancing
Sonny : reciting
Joel : dancing
Anny : reciting
Anny : singing
}
array set res {}
set anny {}
lappend anny [list dancing [regexp -all {Anny\s*:\s*dancing} $file_content] ]
lappend anny [list singing [regexp -all {Anny\s*:\s*singing} $file_content] ]
lappend anny [list reciting [regexp -all {Anny\s*:\s*reciting} $file_content] ]
set res(Anny) $anny
puts [array get res]
如果我运行它,则输出为:
Anny {{dancing 1} {singing 1} {reciting 1}}
现在您可以根据需要使用数组格式化输出。
当然你应该对其他名称做同样的事情,所以最好把代码放在一个函数中。
答案 3 :(得分:0)
这是一种方法。
计算不同行的数量。摆脱结肠。
foreach line [split $data \n] {
dict incr d0 [string map {: {}} $line]
}
将行和字典转换为分层字典,其中名称位于最高级别,活动位于下一级别。如果line
包含" Joel Dancing",则在使用{*}
:dict set d1 Joel dancing 1
展开后,下面的调用将会创建字典项Joel {dancing 1}
。
dict for {line count} $d0 {
dict set d1 {*}$line $count
}
迭代字典并打印键和值。
dict for {name activities} $d1 {
puts "$name -"
foreach {activity count} $activities {
puts "$activity $count"
}
puts {}
}