输入输出文件处理和重新排列数据
input output file handling and rearranging data
我是 Tcl 的新手我想从文件中读取数据假设 text.txt 并且文件的内容是
Name Delay Trans Load
----------------------------
AND1_2X 1.50ns 0.1 1.25ff
AND1_3X 1.75ns 0.2 1.98ff
AND2_3X 2.37ns 0.3 2.27ff
AND2_4X 1.82ns 0.5 2.54ff
NAND1_2X 2.14ns 0.2 1.69ff
NAND2_3X 2.48ns 0.3 2.11ff
现在我想读取数据并像使用空格一样重新排列
Name Trans Load Delay
-----------------------------
AND1_2X 0.1 1.25ff 1.50ns
AND1_3X 0.2 1.98ff 1075ns
AND2_3X 0.3 2.27ff 2.37ns
AND2_4X 0.5 2.54ff 1.82ns
NAND1_2X 0.2 1.69ff 2.14ns
NAND2_3X 0.3 2.11ff 2.48ns
我已经尝试了代码,得到的输出是
Name Trans Load Delay ----------------------------- AND1_2X 0.1 1.25ff 1.50ns AND1_3X 0.2 1.98ff 1.75ns AND2_3X 0.3 2.27ff 2.37ns AND2_4X 0.5 2.54ff 1.82ns NAND1_2X 0.2 1.69ff 2.14ns NAND2_3X 0.3 2.11ff 2.48ns
密码是
set fp [open "file1.txt" r+]
set l1 {}
while { [gets $fp data] >= 0 } {
set data1 [split $data "\n"]
puts [lindex $data 0]
foreach line $data1 {
set cline [regsub " +" $line " "]
set dat1 [split $cline]
puts $dat1
puts [lindex $dat1 5]
lappend l1 [lindex $dat1 0]
lappend l1 [lindex $dat1 3]
lappend l1 [lindex $dat1 4]
lappend l1 [lindex $dat1 5]
lappend l1 [lindex $dat1 1]
}
}
puts $l1
set x [join $l1]
set fp1 [open "input.txt" w+]
puts $fp1 $x
close $fp1
close $fp
您遇到的第一个问题是您的最终 join
错误:您需要告诉它加入换行符而不是默认值(单个空格):
set x [join $l1 "\n"]
其次,当您生成 fixed-width 行时,例如:
AND1_2X 0.1 1.25ff 1.50ns
你应该使用format
命令来完成。如果您了解 C 的 printf()
,您应该会发现它很直观。否则,使用这样的东西:
# First, this is how to pick out the fields, assuming they're always present
set fieldData [regexp -all -inline {\S+} $line]
# Let's get some good names instead of using loads of lindex calls
lassign $fieldData name delay trans load
# Now let's transform that into the output line
lappend l1 [format "%-8s %3s %5s %6s" $name $trans $load $delay]
特别是,%3s
表示“格式化此字段”(来自上面代码中的 $trans
)“在 right-aligned 字符串字段中三个字符宽”,并且 %-8s
表示“将此字段格式化为 left-aligned 八个字符宽的字符串字段”。这种东西对于固定宽度输出来说很棒。
如果您要处理固定宽度的输入,偶尔会缺少字段,则需要 scan
(这与 format
有点相反)。
最后,肯定是 special-case header 行。这要容易得多!
我是 Tcl 的新手我想从文件中读取数据假设 text.txt 并且文件的内容是
Name Delay Trans Load
----------------------------
AND1_2X 1.50ns 0.1 1.25ff
AND1_3X 1.75ns 0.2 1.98ff
AND2_3X 2.37ns 0.3 2.27ff
AND2_4X 1.82ns 0.5 2.54ff
NAND1_2X 2.14ns 0.2 1.69ff
NAND2_3X 2.48ns 0.3 2.11ff
现在我想读取数据并像使用空格一样重新排列
Name Trans Load Delay
-----------------------------
AND1_2X 0.1 1.25ff 1.50ns
AND1_3X 0.2 1.98ff 1075ns
AND2_3X 0.3 2.27ff 2.37ns
AND2_4X 0.5 2.54ff 1.82ns
NAND1_2X 0.2 1.69ff 2.14ns
NAND2_3X 0.3 2.11ff 2.48ns
我已经尝试了代码,得到的输出是
Name Trans Load Delay ----------------------------- AND1_2X 0.1 1.25ff 1.50ns AND1_3X 0.2 1.98ff 1.75ns AND2_3X 0.3 2.27ff 2.37ns AND2_4X 0.5 2.54ff 1.82ns NAND1_2X 0.2 1.69ff 2.14ns NAND2_3X 0.3 2.11ff 2.48ns
密码是
set fp [open "file1.txt" r+]
set l1 {}
while { [gets $fp data] >= 0 } {
set data1 [split $data "\n"]
puts [lindex $data 0]
foreach line $data1 {
set cline [regsub " +" $line " "]
set dat1 [split $cline]
puts $dat1
puts [lindex $dat1 5]
lappend l1 [lindex $dat1 0]
lappend l1 [lindex $dat1 3]
lappend l1 [lindex $dat1 4]
lappend l1 [lindex $dat1 5]
lappend l1 [lindex $dat1 1]
}
}
puts $l1
set x [join $l1]
set fp1 [open "input.txt" w+]
puts $fp1 $x
close $fp1
close $fp
您遇到的第一个问题是您的最终 join
错误:您需要告诉它加入换行符而不是默认值(单个空格):
set x [join $l1 "\n"]
其次,当您生成 fixed-width 行时,例如:
AND1_2X 0.1 1.25ff 1.50ns
你应该使用format
命令来完成。如果您了解 C 的 printf()
,您应该会发现它很直观。否则,使用这样的东西:
# First, this is how to pick out the fields, assuming they're always present
set fieldData [regexp -all -inline {\S+} $line]
# Let's get some good names instead of using loads of lindex calls
lassign $fieldData name delay trans load
# Now let's transform that into the output line
lappend l1 [format "%-8s %3s %5s %6s" $name $trans $load $delay]
特别是,%3s
表示“格式化此字段”(来自上面代码中的 $trans
)“在 right-aligned 字符串字段中三个字符宽”,并且 %-8s
表示“将此字段格式化为 left-aligned 八个字符宽的字符串字段”。这种东西对于固定宽度输出来说很棒。
如果您要处理固定宽度的输入,偶尔会缺少字段,则需要 scan
(这与 format
有点相反)。
最后,肯定是 special-case header 行。这要容易得多!