#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:
- Нет необходимости разделять строку $пробелом. До тех пор, пока $line можно использовать в качестве правильного списка, вы можете использовать
lindex
в $line. - Я думаю, что вы хотите печатать только тогда, когда
llength
будет 5 (а не 4). - Я заметил, что в вашем примере кода есть двойные кавычки, отличные от 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]