gnuplot:使用正则表达式解析字符串

Zhi*_*har 1 regex string parsing gnuplot

告诉我PLZ您如何在gnuplot脚本中

1)解析字符串并从中提取数字和字母/字符串?

2)是否可以使用关联数组以免使用多重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
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我需要从形式的文件名获得的秒数...[d=17s]......[d=2m]......[d=15h]...

在更复杂的情况下:(...[d = 2h7m31s]...这是一个一般情况,对我来说不太可能有用,但是知道如何解决它会很有趣)

the*_*ozh 5

gnuplot不支持正则表达式,但是您可以编写一个函数以秒为单位从文件名中提取时间。如果您的文件名和时间戳具有严格的格式,例如"...[d=2h7m31s]..."可以使用以下代码。否则,您必须对其进行相应调整。

  1. 首先2h7m31sstrstrt()
  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
Run Code Online (Sandbox Code Playgroud)

结果:

7651
Run Code Online (Sandbox Code Playgroud)

加成:

下面的代码还包括其他的可能性,只要该序列是...[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
Run Code Online (Sandbox Code Playgroud)

结果:

31
420
7200
451
7231
7651
Run Code Online (Sandbox Code Playgroud)