Tcl читает первую строку файла CSV - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь проанализировать CSV, чтобы проверить, присутствует ли один из заголовков.Иногда я ожидал пятую колонну с произвольным заголовком

date   time   value  result arbitraryHead 
val1   d1      10     fail
val2   d2      15     norun

Я пытался прочитать первую строку, а затем распечатать ее.Но это не работает ... Как я могу прочитать первую строку и напечатать все заголовки?

set fh [open $csv_file r]
set data [list]
set line [gets $fh line]
lappend data [split $line ,]
close $fh
foreach x $data {
    puts "$x\n"
}

Ответы [ 2 ]

1 голос
/ 17 марта 2019

При чтении файла 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 возвращает прочитанную строку, что затрудняет распознавание ошибок, но очень удобно.

0 голосов
/ 01 апреля 2019

Самое простое, что вы можете сделать - это операция сопоставления строк, просто найдите нужный заголовок, который вы хотите проверить.

В соответствии с запросом в следующем коде я проверяю "произвольный заголовок"

set fh [open $csv_file r]
set contents [read $fh ]

foreach x $contents {
    if {[string match "*arbitraryHead*" $x]} {
        puts "HEAD FOUND"
    }
}
close $fh

Надеюсь, что этот адрес вашей проблемы

...