как читать и выполнять расчеты по значению фиксированной точки с помощью tcl - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы прочитать этот файл ниже с tcl:

        BEGIN
        %Time (real)        HG (real)
        !Time               HG

        -0.000110400001          0.6
        -0.000110399901          0.6
        -0.000110399801          0.6
        -0.000110399701          0.6
        -0.000110399601         0.55
        -0.000110399501          0.5
        -0.000110399401         0.45
        -0.000110399301          0.4
        -0.000110399201         0.45
        -0.000110399101          0.5
        -0.000110399001         0.55
        -0.000110398901          0.6

Для каждого столбца времени, я хотел бы увеличить на +0,000110400001 и записать этот результат в новый файл. Я хотел бы, чтобы другой столбец не был изменен и скопировать как таковой.

Я начал кодировать (см. Ниже), я могу открыть и прочитать значение, но я не знаю, как преобразовать строку в фиксированную точку и добавить к ней дополнение. Если кто-нибудь поможет мне, это было бы хорошо.

set inVector  [lindex $argv 0]

puts "input vector : $inVector"

set filename "resultat.mdf"

set fileId [open $filename "w"]

set PROCESSING_FILE [open "$inVector" r]

while {[eof $PROCESSING_FILE]==0} {
    set string [gets $PROCESSING_FILE]
    if {[string index $string 3] != "B"} {
        if {[string index $string 3] != "%"} {
            if {[string index $string 3] != "!"} {
                foreach line $string {
                    puts "input value : $line"
                }
            } else {
              puts $fileId $string
            }

        } else {
            puts $fileId $string
        }
    } else {
      puts $fileId $string
    }
}


close $PROCESSING_FILE
close $fileId

1 Ответ

0 голосов
/ 07 апреля 2020

Для строк с включенными цифрами вы, вероятно, могли бы прочитать их так:

scan $string "%f %f" time hg

Если это возвращает 2 (для двух обработанных полей), вы успешно прочитали два числа (с плавающей запятой) из этой строки , В противном случае линия это нечто другое. Это приводит к такому коду (с некоторыми стандартными построчными идиомами, которые, должно быть, уже были написаны в каком-то другом вопросе):

# Skipping all the code for opening files

# While we successfully read a line from the input file
while {[gets $PROCESSING_FILE line] >= 0} {
    # Attempt to parse two floats (with at least one whitespace between) out of line
    if {[scan $line "%f %f" time hg] == 2} {
        # Action to take on a matched line
        puts "input line: '$line' time:$time HG:$hg"
    } else {
        # Action to take on an unmatched line
        puts $fileId $line
    }
}

# Skipping the code for closing files

Для файлов с полями действительно фиксированной ширины вы используете string range, чтобы выделить фрагменты строки, а затем попытаться разобрать их (или вы пишете грязное регулярное выражение и используете regexp). Те, как правило, нуждаются в большей настройке на данные.

...