Текстовые файлы такого размера просты: они легко помещаются в памяти.Основная проблема, с которой вы, вероятно, столкнетесь, заключается в том, что Tcl (совместно с многими языками программирования) индексирует вещи, начинающиеся с нуля, а не с одного.
# Read the text in
set f [open "thefile.txt"]
set data [read $f]
close $f
# Split the data into a list of lines
set data [split $data "\n"]
# Now go over the lines and extract the fields
for {set i 0} {$i < 300} {incr i} {
set line [lindex $data $i]
set fields [split $line]; # NB: ASSUMES FIELDS SEPARATED BY SINGLE SPACES
set variable1 [lindex $fields 0]
set variable2 [lindex $fields 1]
set variable3 [lindex $fields 2]
}
Но есть лучшие способыделая это.В частности, поскольку мы выполняем все строки последовательно и всегда извлекаем непрерывный диапазон полей, мы можем быть более краткими:
set f [open "thefile.txt"]
set data [read $f]
close $f
foreach line [split $data "\n"] {
lassign [split $line] variable1 variable2 variable3
}
Последняя сложность заключается в том, что поля не обязательно разделяются на одинпространства;когда (хотя бы иногда) несколько пробелов между полями, это эффектно проваливается, потому что split
на самом деле довольно глупая команда.Мы исправим это, написав некоторый код, который сделает разделение для нас, используя одну из более мощных команд Tcl;в этом случае regexp
(команда сопоставления регулярного выражения) является правильным инструментом:
set f [open "thefile.txt"]
set data [read $f]
close $f
foreach line [split $data "\n"] {
lassign [regexp -all -inline {\S+} $line] variable1 variable2 variable3
}
Это немного длиннее, но намного более надежно в реальном миреданные.(В пакете Tcllib textutil есть и другие подходы для этого разделения, но правильный подход на самом деле зависит от того, каковы ваши входные данные. Вы знаете это лучше, чем мы!)
Кроме того, незабудьте на самом деле что-то сделать с теми переменными, которым вы назначеныПросто назначить их - довольно пустое упражнение.