tcl - 如何从文本文件中读取和存储元素,并在 tcl 中使用正则表达式将其存储在另一个文件中
问题描述
这是我需要使用 tcl 中的正则表达式在另一个文件中提取 "index_1" 、 "index_2" 和 "values" 信息的给定表
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 语法。关于 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
,您必须小心数据文件中是否存在恶意代码。
推荐阅读
- webdatarocks - webdatarocks 1.4 版中引入了哪些更改?
- django - Postgresql 数据库服务器不断随机关闭
- google-apps-script - 根据搜索删除 Google 表格应用脚本中的背景颜色
- python - Python api调用运行客户端
- php - 数组未使用 sort() 函数 PHP 进行排序
- php - 不明白为什么会出现语法错误——laravel 语法错误
- c++ - 如何在 C++ 中创建字典?
- html - 2排轮播第一排头像第二排描述与不同
- typescript - React Native Typescript FlatList ListRenderItem 添加 if 语句
- java - how to save text to file in Android Studio?