gnuplot:将数据文件1:1装入数据块

时间:2019-02-08 21:03:09

标签: gnuplot data-files

如何将数据文件原样(或1:1)读入数据块? 我怎么能独立地做这个平台呢? 到目前为止,我的尝试:

### load datafile "as is" into datablock for different platforms

FILE = 'Test.dat'

if (GPVAL_SYSNAME[:7] eq "Windows") {          # "Windows_NT-6.1" is shown on a Win7 system
    load "< echo $Data ^<^<EOD & type ".FILE
}
if (GPVAL_SYSNAME eq "Linux") {                # that's shown on a Raspberry
    load '< echo "\$Data << EOD" & cat '.FILE
}
if (GPVAL_SYSNAME eq "Darwin") {               # this was shown on a MacOS Sierra 10.12.6
    # how to load a datafile into datablock under MacOS?
}

print $Data
### end of code

在Win10,其他Linux和其他MacOS系统上,GPVAL_SYSNAME的值是什么? 我需要覆盖所有常见系统的几条if语句? 至少在Windows下,控制台窗口正在闪烁。我怎么可能压制这个?

我将数据读入数据集的想法如下:

  1. 如果您的数据在非常慢的服务器路径上
  2. 如果您的数据文件比较大
  3. 如果您拟合并绘制来自多个文件的多条曲线

例如:

FILE1 = '\\SlowServer\blah\BigDataFile.dat'
FILE2 = '\\SlowerServer\blah\BiggerDataFile.dat'
FILE3 = '\\SlowestServer\blah\BiggestDataFile.dat'
fit f(x) FILE1 u 1:2 via a,c,d,e
fit g(x) FILE2 u 2:3 via f,g,h,i
fit h(x) FILE3 u 2:3 via j,k,l,m
plot FILE1 u 1:2:3 w l, \
     '' u (function($1)):(function($2)):3 with <whatever>, \
     FILE2 u 4:5:6 w l, \
     '' u 1:2:3 w l, \
     FILE3 u 7:8:9 w l, \
     '' u 1:2:3 w l , \
     <and more...>

我的问题:

  1. 每次绘制或拟合FILE''时,FILE的内容会一次又一次地加载还是保留在内存中?
  2. 如果放大,例如在交互式wxt终端中,我觉得好像文件需要再次加载。这是真的吗?
  3. 如果一次又一次地加载文件,不是最好的做法是在一开始就一次将文件加载一次到数据块中,然后再使用这些数据块吗?

任何解释,限制,利弊和评论都值得赞赏。

添加:

(部分答案,但有新问题): 对于Windows,Linux和MacOS系统,以下似乎可以正常工作。 Linux和MacOS显然是相同的。

if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo $Data ^<^<EOD & type "Test.dat"' }
if (GPVAL_SYSNAME eq "Linux" )      { load '< echo "\$Data << EOD" & cat "Test.dat"' }
if (GPVAL_SYSNAME eq "Darwin")      { load '< echo "\$Data << EOD" & cat "Test.dat"' }

但是,如果我想从外部gnuplot过程"FileToDatablock.gpp"调用此构造,则它会在Win7 / 64下重生gnuplot崩溃(没有机会测试Linux或MacOS)。

"FileToDatablock.gpp"

### Load datafile "as is" 1:1 into datablock for different platforms
# ARG1 = input filename
# ARG2 = output datablock
# usage example: call "FileToDatablock.gpp" "Test.dat" "$Data"

if (ARGC<1) { ARG1 = "Test.dat" }
if (ARGC<2) { ARG2 = "$Data" }
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo '.ARG2.' ^<^<EOD & type "'.ARG1.'"' }
if (GPVAL_SYSNAME eq "Linux" ) { load '< echo "\'.ARG2.' << EOD" & cat "'.ARG1.'"' }
if (GPVAL_SYSNAME eq "Darwin") { load '< echo "\'.ARG2.' << EOD" & cat "'.ARG1.'"' }
### end of code

以及调用此过程的文件:

### load datafile 1:1 into datablock
reset session

# this works fine under Win7/64
FILE = "Test.dat"
DATA = "$Data"
load '< echo '.DATA.' ^<^<EOD & type "'.FILE.'"'
print $Data

# this crashes gnuplot under Win7/64
call "tbFileToDatablock.gpp" "Test.dat" "$Data"
print $Data
### end of code

这是怎么了?谁能解释为什么以及如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

只要知道输入数据格式,就可以将文件读入数据块。例如,您有一个文件MyFile1,该文件具有3列的数字,您希望将其读入数据块MyBlock1,然后以3种方式进行绘制:

set table $MyBlock1
   plot "MyFile1" using 1:2:3 with table
unset table
plot $MyBlock1 using 1:2 with points
plot $MyBlock1 using 2:3 with points
plot $MyBlock1 using 1:3 with lines

这可以避免多次读取文件,并且应该可以在任何平台上运行。比起这样做,我想将文件从慢速文件系统复制到本地文件系统会更简单。

答案 1 :(得分:0)

这个想法是将数据文件按原样(1:1)放入数据块中,包括注释行或空行等。 据我所知,似乎没有简单直接的平台-“独立”的gnuplot命令。 在某些情况下,将数据包含在数据块中(从gnuplot 5.0起可用)可能是有利的,因为您可以按索引简单地寻址行(仅从gnuplot 5.2起),例如$Data[7],或向前或向后循环数据,而使用文件中的数据则不容易。

这终于是一个我可以接受的解决方案,它似乎可以在Windows和Linux上运行(已测试Windows 7和10以及Ubuntu 18.04.4)。我无法在MacOS上进行测试,但我认为该命令与Linux相同,并且也适用于MacOS。我不了解其他操作系统(感谢反馈)。

代码:

### load data file as is 1:1 into datablock
reset session

FileToDatablock(f,d) = GPVAL_SYSNAME[1:7] eq "Windows" ? \
                       sprintf('< echo   %s ^<^<EOD  & type "%s"',d,f) : \
                       sprintf('< echo "\%s   <<EOD" & cat  "%s"',d,f)     # Linux/MacOS

FILE = 'Test.dat'
load FileToDatablock(FILE,'$Data')

print $Data
### end of code

数据文件:Test.dat

# This is a test file
1.1    1.2
2.1    2.2
3.1    3.2

# another commented line
4.1    4.2
5.1    5.2
# some empty lines will follow


  6.1    6.2   # some spaces at the beginning
7.1    7.3
# end of datafile

结果:(预期$Data是1:1,等于Test.dat

# This is a test file
1.1    1.2
2.1    2.2
3.1    3.2

# another commented line
4.1    4.2
5.1    5.2
# some empty lines will follow


  6.1    6.2   # some spaces at the beginning
7.1    7.3
# end of datafile