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]
}