“保存文本文件”問題大家好,
在過去的幾天裡,我對一個腳本感到非常惱火,儘管它在 Mac OS 上運行良好,但我無法在 Windows 上運行。 經過多次比較,我闡明這是由於文本文件創建方式的差異造成的。 需要創建此文件,因為它用作我使用 JSL 函數“運行程序”在 JMP 中運行的另一個程序的輸入。 這一切在 Mac 上都運行良好。 生成文本文件的最初一小段代碼是
filename = Eval Insert( "^simdir^^lakename^/^lakename^.par" );
lakepar = Eval Insert(
"\[{
"Input" : {
"Initial conditions" : "^simdir^^lakename^/icond.dat",
"Grid" : 24,
"Morphology" : "^simdir^^lakename^/hypso.dat",
"Forcing" : "^simdir^^lakename^/forcing.dat",
"Absorption" : "^simdir^^lakename^/lightextinction.dat",
"Inflow" : "^simdir^^lakename^/Qin.dat",
"Outflow" : "^simdir^^lakename^/Qout.dat",
"Inflow temperature" : "^simdir^^lakename^/Tin.dat",
"Inflow salinity" : "^simdir^^lakename^/Sin.dat"
},
.
.
.
.
}
}
]\"
);
Save Text File( filename, lakepar, "replace" );
在 Mac OS 上,輸出文本文件按其應有的方式組織整齊,如下所示:
{
"Input" : {
"Initial conditions" : "/Users/yvesprairie/Dropbox/sim3/Petit-Saut/icond.dat",
"Grid" : 24,
"Morphology" : "/Users/yvesprairie/Dropbox/sim3/Petit-Saut/hypso.dat",
"Forcing" : "/Users/yvesprairie/Dropbox/sim3/Petit-Saut/forcing.dat",
"Absorption" : "/Users/yvesprairie/Dropbox/sim3/Petit-Saut/lightextinction.dat",
"Inflow" : "/Users/yvesprairie/Dropbox/sim3/Petit-Saut/Qin.dat",
"Outflow" : "/Users/yvesprairie/Dropbox/sim3/Petit-Saut/Qout.dat",
"Inflow temperature" : "/Users/yvesprairie/Dropbox/sim3/Petit-Saut/Tin.dat",
"Inflow salinity" : "/Users/yvesprairie/Dropbox/sim3/Petit-Saut/Sin.dat"
},但在 Windows 上,這就像一條長而連續的線。 奇怪的是,我什至無法將它粘貼到這裡,因為它看起來不錯,但是當我在 Atom 等文本編輯器中打開它時,文件看起來非常不同。 這種差異使得“運行程序”可執行文件無法讀取該文件。 我認為這與隱藏字符有關,但在 Mac 和 Windows 版本中,我在偏好設置中使用完全相同的“保存文本文件”選項(CR+LF,以及逗號作為字段結尾),並且我還使用將文本文件另存為 unicode 的選項。 我不知道還能嘗試什麼。 任何幫助/建議將不勝感激。
最好的問候,伊夫
回复:“保存文本文件”問題您的解決方案非常有效,再次非常感謝您! 伊夫
回复:“保存文本文件”問題非常感謝克雷格的詳細解釋。 我會嘗試並報告! 再次感謝,伊夫
回复:“保存文本文件”問題Mac 和 Win(以及 Linux)在如何使用換行符方面有著奇怪且不同的歷史。 這裡發生了很多事情:
- 您正在將某種換行符序列放入字符串中。 Win 和 Mac 之間可能有所不同。
- SaveTextFile 可能會在換行符上進行一些特定於主機的轉換。 它可能會有所不同...
- 不同的編輯器可能會以不同的方式處理換行序列。 它可能會有所不同...
JMP 可以控制前兩個,並且您很可能可以找到一組適合您的編輯器的換行符。
要設置換行序列,請嘗試其中之一,將 CR 和 LF 的任何序列替換為可預測的序列
lakepar = regex(lakepar,"[\n\r]+","\!n",GLOBALREPLACE);
// or
lakepar = regex(lakepar,"[\n\r]+","\!r",GLOBALREPLACE);
// or
lakepar = regex(lakepar,"[\n\r]+","\!r\!n",GLOBALREPLACE);
LF、CR 或 CRLF 是換行序列的常見可能性。
為了防止 savetextfile 將換行序列轉換為它認為主機需要的內容,請保存一個 blob:
saveTextFile( "$desktop/x.txt", chartoblob(lakepar) );
要查看字符串或文件,請使用 blob:
show(chartoblob(lakepar));
// or
show(loadtextfile( "$desktop/x.txt", blob));// to view
加載文本文件("$desktop/x.txt", blob) = Char To Blob( "abc~0D~0Adef~0D~0Aghiu", "ascii~hex" );
~0D 是 CR,~0A 是 LF
回复:“保存文本文件”問題您需要在您想要的位置輸入換行符。在 Windows 上,新行字符序列是 \!n