gnuplot:如何获取包含非 ANSI 字符的文件列表?
gnuplot: How to get a file list with non-ANSI characters?
我想将几个文件加载到 gnuplot(在 Windows 下)。
为此,我使用命令 system()
。检查以下最小示例。
只要文件名中只有 ANSI 字符,这就可以正常工作。
嗯,希腊字母和基里尔字母表可能是极端情况,但是像 ä,ö,ü,ß,é,à,ñ... 这样的字符如果能正确处理就更好了。
当然可以:
- 重命名文件以仅包含 ANSI 字符(实际上不是一个选项)
- 使用外部工具创建文件名文件并将其保存为 utf-8 文件并将此文件列表加载到 gnuplot(尽可能避免)
- 使用
set print
使用 gnuplot 创建这样一个文件名文件,但是,gnuplot 似乎将文件保存为 ANSI 编码。
是否有 gnuplot 的直接解决方案来处理这些特殊字符?
代码:
### get a file list from a directory (Windows)
reset session
set encoding utf8
PATH = 'CountryTest\'
GetFileList(p,f) = sprintf('dir /b "%s%s"', p, f)
FILES = system(GetFileList(PATH,'*.dat'))
print FILES
set print "Countries.txt"
print FILES
set print
### end of code
结果 1:(gnuplot 5.2.8 控制台,编码为 utf8)
Belgi�.dat
C�te d'Ivoire.dat
Espa�a.dat
L�tzebuerg.dat
M�xico.dat
Panam�.dat
Per�.dat
Rom�nia.dat
T�rkiye.dat
�ire.dat
�sland.dat
�sterreich.dat
Cesko.dat
?????.dat
??????.dat
Result2:(gnuplot创建的文件Countries.txt
,Notepad++告诉我文件是ANSI编码的)
Belgi‰.dat
C“te d'Ivoire.dat
Espa¤a.dat
L‰tzebuerg.dat
M‚xico.dat
Panam .dat
Per£.dat
Romƒnia.dat
Trkiye.dat
ire.dat
Ösland.dat
™sterreich.dat
Cesko.dat
?????.dat
??????.dat
更新:
如果我在 Windows 控制台中键入以下内容:
chcp 65001 && dir /b "CountryTest\*.dat" > "CountryTest\Countries.txt"
我得到文件 Countries.txt
:
België.dat
Côte d’Ivoire.dat
España.dat
Lëtzebuerg.dat
México.dat
Panamá.dat
Perú.dat
România.dat
Türkiye.dat
Éire.dat
Ísland.dat
Österreich.dat
Česko.dat
Ελλάς.dat
Россия.dat
但是,如果我在 gnuplot 脚本中使用相同的命令:
system('chcp 65001 && dir /b "CountryTest\*.dat" > "CountryTest\Countries.txt"')
我得到这个文件 Countries.txt
:
Belgi‰.dat
C“te d'Ivoire.dat
Espa¤a.dat
L‰tzebuerg.dat
M‚xico.dat
Panam .dat
Per£.dat
Romƒnia.dat
Trkiye.dat
ire.dat
Ösland.dat
™sterreich.dat
Cesko.dat
?????.dat
??????.dat
那么,gnuplot 的 system()
命令出了什么问题?
感谢 superuser 上的用户@ItWasn'tMe,我最终得到了一个解决方案,除非在 gnuplot 中直接实现,否则可能无法进一步改进。
起点:(具有以下文件名的子目录CountryTest\
)
België.dat
Côte d’Ivoire.dat
España.dat
Lëtzebuerg.dat
México.dat
Panamá.dat
Perú.dat
România.dat
Türkiye.dat
Éire.dat
Ísland.dat
Österreich.dat
Česko.dat
Ελλάς.dat
Россия.dat
代码:(使用 Windows 10 和 gnuplot >=5.2.0 测试)
### get UTF8 file list into a datablock (Windows)
reset session
# get UTF8 filenames of a filtered directory (Windows only)
GetFileList(p,f,d) = sprintf('<ECHO %s ^<^<EOD & <CON: chcp 65001 >nul & cmd.exe /c dir /b "%s%s"', d, p, f)
PATH = 'CountryTest\'
EXPR = '*.dat'
load GetFileList(PATH, EXPR, '$myFiles')
set offsets 1,1,1,1
plot $myFiles u 0:0:($Data[[=11=]+1]) w labels notitle
### end of code
结果:
我想将几个文件加载到 gnuplot(在 Windows 下)。
为此,我使用命令 system()
。检查以下最小示例。
只要文件名中只有 ANSI 字符,这就可以正常工作。
嗯,希腊字母和基里尔字母表可能是极端情况,但是像 ä,ö,ü,ß,é,à,ñ... 这样的字符如果能正确处理就更好了。
当然可以:
- 重命名文件以仅包含 ANSI 字符(实际上不是一个选项)
- 使用外部工具创建文件名文件并将其保存为 utf-8 文件并将此文件列表加载到 gnuplot(尽可能避免)
- 使用
set print
使用 gnuplot 创建这样一个文件名文件,但是,gnuplot 似乎将文件保存为 ANSI 编码。
是否有 gnuplot 的直接解决方案来处理这些特殊字符?
代码:
### get a file list from a directory (Windows)
reset session
set encoding utf8
PATH = 'CountryTest\'
GetFileList(p,f) = sprintf('dir /b "%s%s"', p, f)
FILES = system(GetFileList(PATH,'*.dat'))
print FILES
set print "Countries.txt"
print FILES
set print
### end of code
结果 1:(gnuplot 5.2.8 控制台,编码为 utf8)
Belgi�.dat
C�te d'Ivoire.dat
Espa�a.dat
L�tzebuerg.dat
M�xico.dat
Panam�.dat
Per�.dat
Rom�nia.dat
T�rkiye.dat
�ire.dat
�sland.dat
�sterreich.dat
Cesko.dat
?????.dat
??????.dat
Result2:(gnuplot创建的文件Countries.txt
,Notepad++告诉我文件是ANSI编码的)
Belgi‰.dat
C“te d'Ivoire.dat
Espa¤a.dat
L‰tzebuerg.dat
M‚xico.dat
Panam .dat
Per£.dat
Romƒnia.dat
Trkiye.dat
ire.dat
Ösland.dat
™sterreich.dat
Cesko.dat
?????.dat
??????.dat
更新:
如果我在 Windows 控制台中键入以下内容:
chcp 65001 && dir /b "CountryTest\*.dat" > "CountryTest\Countries.txt"
我得到文件 Countries.txt
:
België.dat
Côte d’Ivoire.dat
España.dat
Lëtzebuerg.dat
México.dat
Panamá.dat
Perú.dat
România.dat
Türkiye.dat
Éire.dat
Ísland.dat
Österreich.dat
Česko.dat
Ελλάς.dat
Россия.dat
但是,如果我在 gnuplot 脚本中使用相同的命令:
system('chcp 65001 && dir /b "CountryTest\*.dat" > "CountryTest\Countries.txt"')
我得到这个文件 Countries.txt
:
Belgi‰.dat
C“te d'Ivoire.dat
Espa¤a.dat
L‰tzebuerg.dat
M‚xico.dat
Panam .dat
Per£.dat
Romƒnia.dat
Trkiye.dat
ire.dat
Ösland.dat
™sterreich.dat
Cesko.dat
?????.dat
??????.dat
那么,gnuplot 的 system()
命令出了什么问题?
感谢 superuser 上的用户@ItWasn'tMe,我最终得到了一个解决方案,除非在 gnuplot 中直接实现,否则可能无法进一步改进。
起点:(具有以下文件名的子目录CountryTest\
)
België.dat
Côte d’Ivoire.dat
España.dat
Lëtzebuerg.dat
México.dat
Panamá.dat
Perú.dat
România.dat
Türkiye.dat
Éire.dat
Ísland.dat
Österreich.dat
Česko.dat
Ελλάς.dat
Россия.dat
代码:(使用 Windows 10 和 gnuplot >=5.2.0 测试)
### get UTF8 file list into a datablock (Windows)
reset session
# get UTF8 filenames of a filtered directory (Windows only)
GetFileList(p,f,d) = sprintf('<ECHO %s ^<^<EOD & <CON: chcp 65001 >nul & cmd.exe /c dir /b "%s%s"', d, p, f)
PATH = 'CountryTest\'
EXPR = '*.dat'
load GetFileList(PATH, EXPR, '$myFiles')
set offsets 1,1,1,1
plot $myFiles u 0:0:($Data[[=11=]+1]) w labels notitle
### end of code
结果: