Необходимо записать определенные столбцы в выходной файл с помощью tcl

#tcl

Вопрос:

Я пытаюсь прочитать файл с 5 столбцами( разделенными разделителем пробелов)

 #text tag x y data_lay  bad bad1 10.0 10.0 L1  good goodn 13.0 11.0 L1  

И пытается вывести определенные столбцы с префиксом в первом столбце в новом файле. Формат вывода должен быть следующим

 Add_obj bad 10.0 10.0 L1   Add_obj good 13.0 11.0 L1  

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

 set fp [open [lindex $argv 0] r]  set colData {}  while {[gets $fp line]gt;=0} {   if {[llength $line] ==4 } {    set colData [split $line “ “]    puts “Add_obj [lindex $colData 0] [lindex $colData 2] [lindex $colData 3] [lindex $colData 4]”    } }  close $fp   

Не могли бы вы помочь с примером кода? Спасибо.

Комментарии:

1. Какой результат вы получили? «длина строки $» не будет равна 4, так как строка $не является списком.

Ответ №1:

  1. Нет необходимости разделять строку $пробелом. До тех пор, пока $line можно использовать в качестве правильного списка, вы можете использовать lindex в $line.
  2. Я думаю, что вы хотите печатать только тогда, когда llength будет 5 (а не 4).
  3. Я заметил, что в вашем примере кода есть двойные кавычки, отличные от ascii , и . Вам нужны регулярные двойные кавычки " .
 set fp [open a.txt]  while {[gets $fp line]gt;=0} {   if {[llength $line] == 5 } {  # Skip header?  if {[string match "#*" $line]} {  continue  }  puts "Add_obj [lindex $line 0] [lindex $line 2] [lindex $line 3] [lindex $line 4]"    } }  close $fp   

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

Комментарии:

1. Большое спасибо, Крис. Большинство из них (1-3 ) являются опечатками, поскольку я вставил образец кода с помощью мобильного телефона. С уважением,

2. Если вы не можете быть уверены, что входные данные являются допустимым списком, используйте regexp для извлечения последовательностей, не содержащих пробелов: set fields [regexp -all -inline {S } $line]