计算特定类型的单词数

时间:2016-10-04 11:09:32

标签: tcl

我有一个包含以下数据的文件

Anny : dancing
Sonny : reciting
Joel : dancing
Anny : reciting
Anny : singing

我想在tcl中使用以下o / p:

Anny -
singing 1
dancing 1
reciting 1

Joel -
dancing 1

我想以这种格式打印他们的计数。

4 个答案:

答案 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 {}
}

文档: dictforeachputssplitstring{*} (syntax)