2011-08-25 25 views
0

输入文件包含一些内容,诸如:如何在所需的格式来显示输入

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 

我需要在命令行参数

,得到的文件名的输出是在所希望的格式:

Administrator 24-04-2011 16:07 
confuser  15-05-2011 16:05 
Public  01-02-2011 20:57 
TechM   29-01-2011 19:28 
vt0013487  12-08-2011 09:36 
+0

你有什么了吗? –

回答

1

所以你正在做一些固定宽度字段输入解析,只不过最后一个字段是可变长度并延伸到行尾。这很简单。唯一不好的一点是我们需要读取所有行来获取输出格式第一个字段的宽度。

假设你提供读取标准输入(即通过重定向),并希望它在标准输出上(所以你也可以重定向到一个文件):

##### Read in and compute the width 
set len 0 
while {[gets stdin line] >= 0} { 
    set date [string range $line 0 16] 
    set name [string range $line 36 end] 
    lappend lines $name $date 
    if {[string length $name] > $len} { 
     set len [string length $name] 
    } 
} 
##### Write out as formatted 
foreach {name date} $lines { 
    puts [format "%-*s %s" $len $name $date] 
} 
+0

如果我们不知道我们按顺序排列的文件的内容,您的方法是否可以正常工作。例如我们不知道文件中内容的存在方式,但我们需要以所需方式重新排列内容。用户____日期_____时间 – deva

+0

@deva:唉,不,因为宽度可能会改变。处理一般的表格格式非常困难,但一旦它可以被约束一点点就变得简单了。提出另一个问题,尽可能详细地解释你正在尽力解决的问题。 –

+0

请好好解释一下这个剧本,因为我很难理解它在剧本中所做的工作; puts [格式“% - * s%s”$ len $ name $ date] ' - '用于左对齐,对吗?如果是这样,*为什么?并且由于您仅格式化“名称”和“日期”字符串,因此如何在接收到的输出中获取“时间”字符串? – deva

1

split打破输入到线,foreach遍历它们,regexp提取字符的相关组从这些行中,format来构造结果字符串(在Tcl中通常不需要format,因为对于常见情况,字符串中的简单变量替换通常工作正常)。

阅读thisthis,thisthis。对于regexp匹配引擎使用的语法,还需要this

而且我怀疑你可能试图使用由exec“荷兰国际集团的DOS命令dir而不是使用glob遍历目录和文件本身生成的输出。如果是的话,这是错误的,使用glob

1

这可能不是回答你的问题:如果你呼吁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] 
} 
+0

好点,你最好在TCL做,如果你可以而不是摆脱任务,然后必须清理它后 –

+0

@glenn:就像你说的这可能不会回答我的问题,但它确实给了我不同的东西被了解。请解释我的脚本,因为我不知道这些命令能够做什么。 – deva

+0

首先,我会向您介绍文档:[here](http://www.tcl.tk/man/tcl8.5/TclCmd/contents.htm)(特别是[this one]](http:// www .tcl.tk/man/tcl8.5/TclCmd/Tcl.htm))和[here](http://tcllib.sourceforge.net/doc/)。如果您是Tcl的新手,请使用[TclTutor](http://www.msen。COM /〜CLIF/TclTutor.html)。请询问您不确定的任何特定命令。 –

相关问题