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

时间:2019-02-22 07:56:11

标签: 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
}

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

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

2 个答案:

答案 0 :(得分:4)

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

  1. 首先用2h7m31s提取strstrt()部分
  2. strptime()解析它
  3. 并使用int()
  4. 从中得出一个整数

代码:

### 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

答案 1 :(得分:1)

我通过搜索相同的目标来到您的职位:grep在文件中间的一个模式,直到一个空格,以获得可在gnuplot中使用的列表字符串。

new_plan.txt:
blabla CIC1 blabla
blabla CIC2.2-prod blabla
blabla CIC1 blabla
etc.

^要解析的文件^

gnuplot> system("cat new_plan.txt| sed -n -E 's/^.*(CIC\\S*).*$/\\1/p' |sort |uniq")

结果:

CIC1 
CIC2.2-prod

烦人的事情不是-忘记对反斜杠\进行反斜杠,因为它在字符串中,因此gnuplot可以通过系统调用来调用它。

我没有回答您的标题问题,但您的最后评论是:

(这是一个一般情况,对我来说不太可能有用,但是 知道如何解决它会很有趣)