【问题标题】:Tcl script to search strings and store in variable用于搜索字符串并存储在变量中的 Tcl 脚本
【发布时间】:2020-02-16 11:01:36
【问题描述】:
Loop = ( 
      {
        Value = ( 
          {
           {
            Key : 
            {
              A = "B";
              C = "D";
              Class = ( 
                {
                  section = "section_a";
                  Pairs = ( 
                    {
                      Name = "Ram";
                      Mark = "80";
                    }, 
                    {
                      Name = "Latha";
                      Mark = "70";
                    }, 
                    {
                      Name = "Mohan";
                      Mark = "90";
                    }, 
                    {
                      Name = "David";
                      Mark = "76";
                    } );
                } );
              Id = 1;
            };
            Absent : 
            {
              DAYS = "Two days";
            };
          }, 
           {
            Key : 
            {
              A = "B";
              C = "D";
              Class = ( 
                {
                  section = "section_b";
                  Pairs = ( 
                    {
                      Name = "Ram";
                      Mark = "30";
                    }, 
                    {
                      Name = "Latha";
                      Mark = "45";
                    }, 
                    {
                      Name = "Mohan";
                      Mark = "100";
                    }, 
                    {
                      Name = "David";
                      Mark = "76";
                    } );
                } );
              Id = 2;
            };
            Absent : 
            {
              DAYS = "Four days";
            };
          }, 
          } );
      } );

我是 tcl 脚本的新手。我有一个上述格式的txt文件。使用 tcl 脚本,我必须将字符串(部分、名称、标记和缺席天数)存储在不同的变量中以存储在 csv 文件中。 我尝试了下面的代码来搜索单词 Key

set search "Key"
set file [open "Marks.txt" r]
 while {[gets $file data] != -1} {
    if {[string match *[string toupper $search]* [string toupper $data]] } {
        puts "Found '$search' in the line '$data'"
    } else {
        puts "does not match" 
    }
 } 

它正在查找单词 key 并在匹配时打印。它适用于包含单词Key 的那一行。但是,在这里我想找到单词Loop,然后我想在侧循环中搜索单词Key。如果它看到单词Key,那么它必须将循环中存在的一些字符串复制到变量中。单词Key 将在文件中重复多次。在Key 这个词之后会有{..} 到处都是文件有一些内容。脚本必须读取内容并将其存储在某个变量中。

Exp:脚本需要在文本文件中找到单词Key,然后查找 如果部分存在,则 section_b 需要存储在变量 temp1(exp.temp1=section_a) 中,同样明智:
如果它看到Ram,则需要将行下方的Mark 存储在temp2 中(exp.temp2=80)。
如果它看到Latha,则需要将行下方的Mark 存储在temp3(exp.temp3=70)中。
然后找到 id 需要存储的值 1 需要存储在temp4(exp.temp4=1)。
然后Days 需要存储在temp5(exp.temp5=Two days)

每次在以下格式的文本文件中看到单词Key时,都需要将这些临时值写入csv文件。

section     Ram  Latha   id    Days
Section_a    80   70     1    Two days
Section_b    30   45     2    Four days

你能帮我写 tcl 脚本来得到这个吗?谢谢。

【问题讨论】:

  • 这是您尝试在那里解析的中等复杂格式...
  • 这是更多的初步工作,但是如果您对这种文件格式做了很多工作,那么使用 tcllib 中的解析器生成器来制作一个包来读取该格式可能是值得的。

标签: tcl


【解决方案1】:

这是 awk 真正擅长的事情:

awk '
    function quoted(string,     a) {
        split(string, a, /"/)
        return a[2]
    }
    BEGIN { OFS="\t"; print "section", "Ram", "Latha", "id", "Days" }
    $1 == "section" {section = quoted($0); delete marks}
    $1 == "Name" {name = quoted($0)}
    $1 == "Mark" {marks[name] = quoted($0)}
    $1 == "Id" {id = gensub(/;/, "", 1, $3)}
    $1 == "DAYS" {print section, marks["Ram"], marks["Latha"], id, quoted($0)}
' file

将其翻译为 Tcl “单线”,我会写

echo '
    proc trim {str} {string trim $str {"}}
    puts "section\tRam\tLatha\tid\tdays"
    set fh [open [lindex $argv end]]
    while {[gets $fh line] != -1} {
        if {[regexp -- {(\S+) = ("[^"]+"|\d+);} $line -> key value]} {
            switch -exact -- $key {
                section {set section [trim $value]; array set marks {}}
                Name    {set name [trim $value]}
                Mark    {set marks($name) [trim $value]}
                Id      {set id $value}
                DAYS    {puts [join [list $section $marks(Ram) $marks(Latha) $id [trim $value]] \t]}
            }
        }
    }
' | tclsh - file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多