我正在编写一个程序,用于将错误/严重性/发生从文件格式转换为表格格式,但它无法正常工作。
档案片段:
error_name: xxxxxxxxxx
Severity: Warning Occurrence: 2
error_name2:xxxxxxxxxxx.
Severity: Warning Occurrence: 16
error_name3:xxxxxxxxxxxxx
Severity: Warning Occurrence: 15
代码:
proc get_clp_summary { Infile } {
set run_summary_file [ glob $Infile/summary.rpt ]
set fp [ open $run_summary_file "r" ]
while { [ gets $fp line ]!= -1 } {
foreach {match label value} [regexp -inline -all {(\w+):\s*(\S*)} $line] {
switch -exact -- $label {
Severity {set sev $value}
Occurrence {set count $value}
default {set err $label}
}
lappend pack_stats [ list $err $sev $count]
puts $pack_stats
}
return $pack_stats
}
##################################################################
set run_time_stats [ get_clp_summary [ lindex $argv 0 ] ]
puts ""
puts ""
puts ""
table_styler
puts " \<table id=\"customers\" style=\"margin-bottom:10px;\" \> "
puts "\<th\> Rule \<\/th\>"
puts "\<th\> Severity \<\/th\>"
puts "\<th\> Occurrence \<\/th\>"
puts "\<\/tr\>"
foreach k $run_time_stats {
set st [ lindex $k 0 ]
set st_type [ lindex $k 1 ]
set st_count [lindex $k 2]
set BGCOLOR #FFFFFF
puts " \<tr\> \<td\> $st \<\/\> \<td bgcolor=\"$BGCOLOR\" \> $st \<\/td\> "
puts "\<td\> \<td bgcolor=\"$BGCOLOR\" \> $st_type \<\/td\> \"
puts "\<td\> $st_count \<\/td\> "
puts "\<\/tr\>"
}
puts " \<\/table\> "
}
puts " \<\/body\> "
puts " \<\/html\> "
答案 0 :(得分:1)
以下是一些观察。
您编写了程序get_clp_summary
,但没有调用它。这就是为什么它不输出任何东西。你需要这样称呼它:
get_clp_summary filename
请不要使用缩写/短手。我花了一段时间才弄明白 o / p 意味着输出。是的,我是那么傻。
答案 1 :(得分:0)
你的主要问题是你的缩进不干净。这是一个微不足道的事情,但它会导致你主要的问题。
这就是原因。当我重新提交你的提交时,我发现程序get_clp_summary
实际上比我最初的想法晚了许多行!这意味着它永远不会被调用(从程序中的一些无法访问的代码进行递归调用,我认为你不想这样做)。如果你正确地缩进缩进,也许是使用程序员编辑器的支持,那么你会更快地发现错位括号等问题。
要修复代码,请执行以下操作:
puts " \<\/table\> "
并将放在
之前return $pack_stats
哦,该代码中还有许多其他问题。至少有一个反斜杠会导致HTML打印部分完全混乱(而且Tcl在\
或<
之前不需要>
。更重要的是,你没有关闭你正在读取的频道,而你假设glob
返回一个文件(它返回一个列表,即使它是一个有时带有一个元素的列表)。您可能希望使用subst
,如下所示:
puts [subst {
<table id="customers" style="margin-bottom:10px;">
<tr>
<th> Rule </th>
<th> Severity </th>
<th> Occurrence </th>
</tr>
}]
foreach k $run_time_stats {
# Consider using: lassign $k st st_type st_count
set st [lindex $k 0]
set st_type [lindex $k 1]
set st_count [lindex $k 2]
set BGCOLOR "#FFFFFF"
puts [subst {
<tr>
<td bgcolor="$BGCOLOR"> $st </td>
<td bgcolor="$BGCOLOR"> $st_type </td>
<td> $st_count </td>
</tr>
}]
}
puts "</table>"
答案 2 :(得分:0)
问题在于foreach
循环,它逐行解析文件。读取第一行后,它没有严重性或计数信息,因此失败,因为变量$sev
和$count
仍未设置。
一个相当粗略但又有效的例子并没有偏离代码太远就是这样。
while { [ gets $fp line ]!= -1 } {
foreach {match label value} [regexp -inline -all {(\w+):\s*(\S*)} $line] {
switch -exact -- $label {
Severity {set sev $value}
Occurrence {set count $value}
default {set err $value}
}
if { [info exists err] && [info exists sev] && [info exists count] } {
lappend pack_stats [ list $err $sev $count]
unset err sev count
}
}
检查直到收集并设置了所有三个变量,然后附加返回列表,然后取消设置它们以便再次收集它们。还更正了default {set err $label}
件,因为它是一个值,而不是标签就是你想要的。如果我的假设是错误的,请恢复。