gnuplot: использовать регулярные выражения для разбора строки - PullRequest
0 голосов
/ 22 февраля 2019

Скажите мне, PLZ, как в скрипте gnuplot вы можете

1) проанализировать строку и извлечь из нее число и букву / строку?

2) возможно ли использовать ассоциативныймассивы, чтобы не использовать multi IF?

files = system(sprintf("dir /b \"%s*.csv\"", inputPath))

do for [name in files]{

    # MY TROUBLES IS HERE
    [value, typeID] = parse(name, "*[%d%s]*"); # pseudocode
    typesList = {"h": 3600, "m": 60, "s": 1};

    scale = value * typesList[typeID];
    # MY TROUBLES IS ABOVE

    myfunc(y) = y * scale

    outputName = substr(name, 0, strlen(name) - strlen(".csv"))

    inputFullPath = inputPath.name
    outputFullPath = outputPath.outputName.outputExt

    plot inputFullPath using 1:(myfunc($2)) with lines ls 1 notitle
}

В моем случае мне нужно получить количество секунд из имени файла вида ...[d=17s]..., ...[d=2m]..., ...[d=15h]... и т. д.

В более сложном случае: ...[d = 2h7m31s]... (это общий случай, он вряд ли будет мне полезен, но было бы интересно узнать, как его решить)

1 Ответ

0 голосов
/ 22 февраля 2019

gnuplot не поддерживает регулярные выражения, но вы можете написать функцию, которая извлекает время в секундах из вашего имени файла.Если ваше имя файла и временная метка имеют строгий формат, например, "...[d=2h7m31s]...", вы можете использовать следующий код.В противном случае вы должны адаптировать его соответствующим образом.

  1. Сначала извлеките часть 2h7m31s с помощью strstrt()
  2. , проанализируйте ее с помощью strptime()
  3. и сделайте целое числоиз него с int()

Код:

### parse special time string

NAME = "Filename[d=2h7m31s].csv"

TimeExtract(s) = int(strptime("%Hh%Mm%Ss",s[strstrt(s,'[d=')+3:strstrt(s,']')-1]))

print TimeExtract(NAME)
### end of code

Результат:

7651

Добавление:

следующий код также охватывает другие возможности, если последовательность ...[d=..h..m..s]...,

### parse special time string

NAME = "Filename[d=2h7m31s]somethingelse.csv"

TimeString(s) = s[strstrt(s,'[d=')+3:strstrt(s,']')-1]

TimeExtractFormat(s) = \
    "%Hh"[1:sgn(strstrt(TimeString(s),'h'))*3].\
    "%Mm"[1:sgn(strstrt(TimeString(s),'m'))*3].\
    "%Ss"[1:sgn(strstrt(TimeString(s),'s'))*3]

TimeExtract(s) = int(strptime(TimeExtractFormat(s),TimeString(s)))

print TimeExtract("Filename[d=31s]somethingelse.csv")
print TimeExtract("Filename[d=7m]somethingelse.csv")
print TimeExtract("Filename[d=2h]somethingelse.csv")
print TimeExtract("Filename[d=7m31s]somethingelse.csv")
print TimeExtract("Filename[d=2h31s]somethingelse.csv")
print TimeExtract("Filename[d=2h7m31s]somethingelse.csv")
### end of code

Результат:

31
420
7200
451
7231
7651
...