как читать и хранить элементы из текстового файла и сохранять его в другом файле, используя регулярное выражение в tcl - PullRequest
0 голосов
/ 26 июня 2018

Это данная таблица Мне нужно извлечь информацию "index_1", "index_2" и "значения" в другой файл, используя регулярное выражение в tcl

internal_power() {
  related_pin : "B0";
  rise_power(energy_template_7x7) {
    index_1 ("0.008, 0.04, 0.08, 0.12, 0.16, 0.224, 0.28");
    index_2 ("0.01, 0.06, 0.1, 0.15, 0.2, 0.25, 0.3");
    values ( \
      "0.002669, 0.002702, 0.002704, 0.002706, 0.002707, 0.002707, 0.002707", \
      "0.002652, 0.002695, 0.002699, 0.002701, 0.002703, 0.002703, 0.002704", \
      "0.002701, 0.002737, 0.002744, 0.002748, 0.00275, 0.002751, 0.002752", \
      "0.002789, 0.002814, 0.002821, 0.002823, 0.002825, 0.002826, 0.002827", \
      "0.002923, 0.002914, 0.002915, 0.002919, 0.002921, 0.002922, 0.002922", \
      "0.00311, 0.003083, 0.003085, 0.003085, 0.003086, 0.003087, 0.003088", \
      "0.003288, 0.003249, 0.00325, 0.003265, 0.003265, 0.003264, 0.003249");
  }

1 Ответ

0 голосов
/ 26 июня 2018

Ваши данные очень близки к действительному синтаксису Tcl.Отличительной особенностью Tcl является то, что довольно просто определить DSL: вам нужно переопределить процедуру по умолчанию unknown.

Могу поспорить, что опубликованные вами данные являются лишь фрагментом вашегофактические данные, поэтому вам придется соответствующим образом их скорректировать.

Файл данных "data.txt"

internal_power() {
  related_pin : "B0";
  rise_power(energy_template_7x7) {
    index_1 ("0.008, 0.04, 0.08, 0.12, 0.16, 0.224, 0.28");
    index_2 ("0.01, 0.06, 0.1, 0.15, 0.2, 0.25, 0.3");
    values ( \
      "0.002669, 0.002702, 0.002704, 0.002706, 0.002707, 0.002707, 0.002707", \
      "0.002652, 0.002695, 0.002699, 0.002701, 0.002703, 0.002703, 0.002704", \
      "0.002701, 0.002737, 0.002744, 0.002748, 0.00275, 0.002751, 0.002752", \
      "0.002789, 0.002814, 0.002821, 0.002823, 0.002825, 0.002826, 0.002827", \
      "0.002923, 0.002914, 0.002915, 0.002919, 0.002921, 0.002922, 0.002922", \
      "0.00311, 0.003083, 0.003085, 0.003085, 0.003086, 0.003087, 0.003088", \
      "0.003288, 0.003249, 0.00325, 0.003265, 0.003265, 0.003264, 0.003249");
  }
}

Сценарий Tcl "data.tcl"

rename unknown _orig_unknown
proc unknown {cmd args} {
    switch -glob -- $cmd {
        internal_power* - rise_power* { 
            # handle "extra characters after close-quote" error
            set code [regsub -all {("[^"]*")(\S)} [lindex $args 0] {\1 \2}]   ; # " appease syntax highlighter
            eval $code
        }
        related_pin {}
        index_1 - index_2 - values {
            dict set ::data $cmd [regexp -inline -all {[\d.-]+} [join $args]]
        }
        default {_orig_unknown $cmd {*}$args}
    }
}

set data [dict create]
source data.txt                  ; # execute the txt file as code.
dict for {cmd values} $data {
    puts "for $cmd, I have [llength $values] values"
    puts "    $values"
}

Выполнение

$ tclsh data.tcl 
for index_1, I have 7 values
    0.008 0.04 0.08 0.12 0.16 0.224 0.28
for index_2, I have 7 values
    0.01 0.06 0.1 0.15 0.2 0.25 0.3
for values, I have 49 values
    0.002669 0.002702 0.002704 0.002706 0.002707 0.002707 0.002707 0.002652 0.002695 0.002699 0.002701 0.002703 0.002703 0.002704 0.002701 0.002737 0.002744 0.002748 0.00275 0.002751 0.002752 0.002789 0.002814 0.002821 0.002823 0.002825 0.002826 0.002827 0.002923 0.002914 0.002915 0.002919 0.002921 0.002922 0.002922 0.00311 0.003083 0.003085 0.003085 0.003086 0.003087 0.003088 0.003288 0.003249 0.00325 0.003265 0.003265 0.003264 0.003249

Конечно, с eval вы должны быть осторожны с наличием вредоносного кода в файле данных.

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