0

我的第一個問題是如何使用Mathematica以固定寬度格式導出數據?我的第二個問題是我如何保留最正確的0。如何在保留sig figs的同時將Mathematica列表作爲固定寬度的文本文件導出?

例如,我想保存{{1.12300, 11.12, 111.123},{2.1, 22.123, 222}}到文本文件作爲

1.12300 11.12 111.123 
2.10  22.123 222.00 

在細節中,如果數量與小於2位的尾數,它通過零填充匹配2,而如果它它的尾數超過2位數,它會保持原樣。對我來說,區分1.123001.123很重要。如果我使用PaddingForm,Mathematica會將其保存爲文本文件PaddedForm[1.123, {4, 5}]

+0

重要的是要理解一個數字,例如「11.12」,一旦鍵入或返回結果是一個機器精度二進制代表浮點數,不再是「完全」1112/100。你應該去mathematica.stackexchange.com進一步的信息,但做一個搜索有幾十個類似的問題。 – agentp

回答

0

使用

data = {{1.12300``6, 11.12``3, 111.123``4}, 
     {2.1``2,  22.123``4, 222``2}}; 

tbl1 = ToString[TableForm[data]]; 
tbl2 = StringReplace[tbl, "\n\n" -> "\n"] 

得到

1.12300 11.12 111.123 
2.1  22.123 222.0 

如果你不想進入你的數據作爲一組字符串,你需要使用``指定數據的準確性。請參閱Mathematica的Numerical Precision教程。

0

是這樣的?

listt = {{1.12300, 11.12, 111.123}, {2.1, 22.123, 222}} 

Export["C:/tcdata/list.txt", Flatten /@ listt, "Table"] 
1

爲了保存上的數字,例如1.12300數據有尾隨零將被接收爲一個字符串。然後它可以像這樣處理。

data = "{{1.12300, 11.12, 111.123}, {2.1, 22.123, 222}}"; 

(* remove any whitespace *) 
d1 = StringReplace[data, " " -> ""]; 

(* split the lists *) 
d2 = StringSplit[StringTake[d1, {3, -3}], "},{"]; 

(* split the numbers *) 
d3 = StringSplit[d2, ","]; 

(* magnitude of number except zero *) 
mag[n_] := Floor[Log[10, Abs[n]]] + 1 

(* format accordingly *) 
d4 = Map[With[{x = ToExpression[#]}, 
    Which[x == 0, If[StringLength[#] > 4, #, "0.00"], 
     FractionalPart[100 x] == 0, 
     [email protected][x, {mag[x] + 2, 2}, 
     ExponentFunction -> (Null &)], 
     True, #]] &, d3, {2}]; 

(* pad output *) 
len = Max[StringLength /@ Flatten[d4]] + 2; 
d5 = Map[StringPadRight[#, len] &, d4, {2}]; 
d6 = StringJoin /@ d5; 
Export["output.txt", d6]; 
Import["output.txt"] 
1.12300 11.12 111.123 
2.10  22.123 222.00 
+0

是的,它確實生成了該示例,但問題是固定寬度格式必須使用空格而不是製表符。不幸的是,這是天文數據中常見的格式。此外,如果我將第一個元素更改爲1.12300000,代碼將無法正常工作。 – Miladiouss

+0

@mpourrah如果你編寫規範,沒有問題來實現固定寬度格式。填充是有趣的 - 一個經常出現的問題。如果第一個數字是1.12300000,應該如何格式化這些列? –

+0

我想我可以找出每列的哪個元素有最多的字符數。 – Miladiouss

相關問題