Индексирование данных текстового файла - PullRequest
0 голосов
/ 10 июня 2018

В настоящее время у меня есть текстовый файл с 300 строками и 3 столбцами.

Мне нужно перебрать все строки, назначив 3 переменные со значениями в 3 столбцах.

Вотмой псевдокод:

for i=1:300
variable1 = element in ith row, 1st column (i,1)
variable2 = element in ith row, 2st column (i,2)
variable3 = element in ith row, 1st column (i,3)
end

Как вызвать элементы (i, 1), (i, 2), (i, 3) в текстовом файле?

Спасибо.

1 Ответ

0 голосов
/ 10 июня 2018

Текстовые файлы такого размера просты: они легко помещаются в памяти.Основная проблема, с которой вы, вероятно, столкнетесь, заключается в том, что 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 есть и другие подходы для этого разделения, но правильный подход на самом деле зависит от того, каковы ваши входные данные. Вы знаете это лучше, чем мы!)


Кроме того, незабудьте на самом деле что-то сделать с теми переменными, которым вы назначеныПросто назначить их - довольно пустое упражнение.

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