При чтении файла CSV лучше всего использовать пакет csv в Tcllib , поскольку он обрабатывает все неудобные крайние случаи в этом формате.
В частности, csv::split
- это особенно полезно (наряду с csv::join
при создании файла CSV).Или различные функции, которые действуют как обертки вокруг этого.Вот как бы вы использовали это в вашем случае
package require csv
set fh [open $csv_file r]
# Your data appears to be actually tab-separated, not comma-separated...
set data [csv::split [gets $fh] "\t"]
close $fh
foreach x $data {
puts "$x\n"
}
Ваша настоящая немедленная ошибка была такой:
set line [gets $fh line]
Форма с двумя аргументами gets
записывает строкуон считывает переменную, указанную во втором аргументе, и возвращает длину прочитанной строки (или -1 при невозможности прочитать полную строку, что может быть полезно в сложных случаях, которые здесь не важны).Вы затем присваиваете это значение той же переменной с set
, теряя строку, которая была там написана.Вместо этого вы должны использовать один из следующего (за исключением того, что вы должны использовать правильно протестированный пакет для чтения файлов CSV):
gets $fh line
set line [gets $fh]
Форма с одним аргументом gets
возвращает прочитанную строку, что затрудняет распознавание ошибок, но очень удобно.