как отобразить ввод в желаемом формате - PullRequest
0 голосов
/ 25 августа 2011
Входной файл

содержит некоторое содержимое, такое как:

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

Ответы [ 3 ]

1 голос
/ 25 августа 2011

Итак, вы выполняете некоторый синтаксический анализ входных данных с фиксированной шириной, за исключением того, что последнее поле имеет переменную длину и простирается до конца строки. Это достаточно просто. Единственный неудобный бит - это то, что нам нужно прочитать все строки, чтобы получить ширину для первого поля выходного формата.

Предполагается, что вы вводите ввод в stdin (т.е. перенаправлением) и хотите, чтобы он вводился в stdout (так что вы также можете перенаправить его в файл):

##### 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]
}
1 голос
/ 25 августа 2011

Это может не ответить на ваш вопрос: если вы звоните 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]
}
1 голос
/ 25 августа 2011

split для разбиения ввода на строки, foreach для итерации по ним, regexp для извлечения соответствующих групп символов из этих строк, format для построения результирующих строк (format часто не требуется вTcl как простая замена переменных в строках обычно работает нормально для обычных случаев).

Читать это , это , это и это .Также это для синтаксиса, используемого механизмом сопоставления regexp.

Также я подозреваю, что вы, возможно, пытаетесь использовать вывод, сгенерированный exec с помощью команды DOS dirвместо использования glob для обхода каталогов и файлов.Если это так, это неправильно, используйте glob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...