Tcl 如何以所需格式显示输入
输入文件包含以下内容:Tcl 如何以所需格式显示输入,tcl,Tcl,输入文件包含以下内容: 15-05-2011 16:05 <DIR> . 15-05-2011 16:05 <DIR> .. 24-04-2011 16:07 <DIR> Administrator 15-05-2011 16:05 <DIR> confuser 01-02-2011 20:57 <DIR>
15-05-2011 16:05 <DIR> .
15-05-2011 16:05 <DIR> ..
24-04-2011 16:07 <DIR> Administrator
15-05-2011 16:05 <DIR> confuser
01-02-2011 20:57 <DIR> Public
29-01-2011 19:28 <DIR> TechM
12-08-2011 09:36 <DIR> vt0013487
split
将输入分成几行,foreach
对其进行迭代,regexp
从这些行中提取相关的字符组,格式化
以构造结果字符串(format
在Tcl中通常不需要,因为字符串中的简单变量替换通常适用于常见情况)
阅读、和。还可以查看regexp
匹配引擎使用的语法
此外,我怀疑您可能试图使用通过DOS
dir
命令执行生成的输出,而不是使用glob
以本机方式遍历目录和文件。如果是这样,这是错误的,请使用split
将输入拆分为行,foreach
对其进行迭代,regexp
to从这些行中提取相关的字符组,format
来构造结果字符串(format
在Tcl中通常不需要,因为字符串中的简单变量替换通常在常见情况下可以正常工作)
阅读、和。还可以查看regexp
匹配引擎使用的语法
此外,我怀疑您可能试图使用由使用DOS
dir
命令的exec
生成的输出,而不是使用glob
以本机方式遍历目录和文件。如果是这样,这是错误的,请使用,这样您可以进行一些固定宽度的字段输入解析,但最后一个字段是可变长度并扩展到行的末尾。这很简单。唯一不方便的是我们需要读取所有行,以获得输出格式的第一个字段的宽度
假设您在stdin上提供输入(即通过重定向),并希望在stdout上提供输入(因此您也可以将其重定向到文件):
所以你在做一些固定宽度的字段输入解析,除了最后一个字段是可变长度并延伸到行的末尾。这很简单。唯一令人尴尬的是,我们需要读取所有行以获得输出格式的第一个字段的宽度 假设您在stdin上提供输入(即通过重定向),并希望在stdout上提供输入(因此您也可以将其重定向到文件):
这可能无法回答您的问题:如果您正在调用
cmd/c dir
,以下是在Tcl中执行此操作的方法:
package require struct::list
set files [glob *]
set maxlen [tcl::mathfunc::max {*}[struct::list map $files {apply {s {string length $s}}}]]
foreach file [lsort $files] {
set datetime [clock format [file mtime $file] -format {%d-%m-%Y %H:%M}]
puts [format {%-*s %s} $maxlen $file $datetime]
}
这可能无法回答您的问题:如果您正在调用
cmd/c dir
,以下是在Tcl中执行此操作的方法:
package require struct::list
set files [glob *]
set maxlen [tcl::mathfunc::max {*}[struct::list map $files {apply {s {string length $s}}}]]
foreach file [lsort $files] {
set datetime [clock format [file mtime $file] -format {%d-%m-%Y %H:%M}]
puts [format {%-*s %s} $maxlen $file $datetime]
}
很好的一点是,如果可以的话,您最好在TCL中完成这项任务,而不是在完成任务后将其清理干净afterwards@glenn:正如你所说,这可能无法回答我的问题,但它确实给了我一个不同的学习内容。请解释一下你的脚本,因为我不知道这些命令能做什么。首先,我将告诉你文档:(特别是)并且。如果您是Tcl新手,请使用。请询问您不确定的任何特定命令。好的方面是,如果可以,您最好在Tcl中执行,而不是在完成任务后再清理它afterwards@glenn当前位置正如你所说,这可能无法回答我的问题,但它确实让我学到了另一件事。请请解释一下你的脚本,因为我不知道这些命令能做什么并且。如果您是Tcl新手,请使用。请询问您不确定的任何特定命令。如果我们不知道我们正在按顺序排列的文件内容,您的方法是否有效。例如,我们不知道文件中内容的显示方式,但我们需要按所需顺序重新排列内容方式。用户日期Time@deva:唉,不,因为宽度可能会改变。处理通用表格格式非常困难,但只要能稍微限制一下,它就会变得简单得多。请问另一个问题,尽可能多地提供您试图真正解决的问题的详细信息。请像我一样解释此脚本省去了理解它在脚本中所做工作的困难;放入[格式“%-*s%s”$len$name$date]“-”表示左对齐,对吗?如果是,那么*表示什么?由于您仅格式化“名称”和“日期”字符串,我如何在收到的输出中也获取“时间”字符串?如果我们不知道按顺序排列的文件的内容,您的方法是否有效。例如,我们不知道cont文件中存在ENT,但我们需要以所需的方式重新排列内容。用户\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuTime@deva:唉,不是,因为宽度可能会改变。处理通用表格格式非常困难,但一旦可以限制一点,它就会变得简单得多。问另一个问题,给出尽可能多的专业表格的详细信息您试图真正解决的问题。请解释此脚本,因为我很难理解它在脚本中所做的工作;请放入[格式“%-*s%s”$len$name$date]“-”表示左对齐,对吗?如果是,那么*表示什么?由于您只格式化“name”和“date”字符串,我如何在收到的输出中也获取“time”字符串?
package require struct::list
set files [glob *]
set maxlen [tcl::mathfunc::max {*}[struct::list map $files {apply {s {string length $s}}}]]
foreach file [lsort $files] {
set datetime [clock format [file mtime $file] -format {%d-%m-%Y %H:%M}]
puts [format {%-*s %s} $maxlen $file $datetime]
}