如何将数据文件原样(或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下,控制台窗口正在闪烁。我怎么可能压制这个?
我将数据读入数据集的想法如下:
例如:
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...>
我的问题:
FILE
和''
时,FILE
的内容会一次又一次地加载还是保留在内存中?任何解释,限制,利弊和评论都值得赞赏。
添加:
(部分答案,但有新问题): 对于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
这是怎么了?谁能解释为什么以及如何解决这个问题?
答案 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