Скрипт Tcl для поиска строк и сохранения в переменной - PullRequest
0 голосов
/ 16 февраля 2020
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. У меня есть текстовый файл в вышеуказанном формате. Используя скрипт 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 в стороне l oop. Если он видит слово Key, он должен скопировать некоторые переменные, присутствующие в l oop, в переменные. Слово 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 meed для хранения в temp5 (exp. temp5 = Two days)

Эти временные значения необходимо записывать в файл CSV каждый раз, когда он видит слово Key в текстовом файле в следующем формате.

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

Можете ли вы помочь мне в написание сценария tcl, чтобы получить это. Спасибо.

1 Ответ

0 голосов
/ 16 февраля 2020

Это то, для чего действительно хорош 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...