обработка входного выходного файла и перестановка данных - PullRequest
0 голосов
/ 26 мая 2019

Я новичок в 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  

1 Ответ

1 голос
/ 26 мая 2019

Первая проблема, с которой вы столкнулись, заключается в том, что ваш последний join ошибочен: вам нужно указать ему присоединение с символами новой строки вместо значения по умолчанию (с одним пробелом):

set x [join $l1 "\n"]

Во-вторых, когда вы создаете линию фиксированной ширины, например:

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 в приведенном выше коде) «в строке с выравниванием по правому краю шириной в три символа», а %-8s означает «отформатировать это поле в выровненное по левому краю поле шириной восемь символов ». Такие вещи отлично для вывода с фиксированной шириной.

Если вы имеете дело с вводом фиксированной ширины с пропущенными случайными полями, вам нужно scan (что-то вроде инверсии format).

Наконец, определенно особый случай строк заголовка. Это намного проще!

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