0

Ma première question est de savoir comment exporter mes données dans un format à largeur fixe en utilisant Mathematica? Ma deuxième question est de savoir comment conserver le droit de la plupart des 0.Comment exporter une liste Mathematica en tant que fichier texte à largeur fixe tout en conservant sig figs?

Par exemple, j'aime enregistrer {{1.12300, 11.12, 111.123},{2.1, 22.123, 222}} dans un fichier texte

1.12300 11.12 111.123 
2.10  22.123 222.00 

En détails, si un nombre a une mantisse avec moins de 2 chiffres, il est adapté à 2 par zéro padding alors que si elle a plus de 2 chiffres dans sa mantisse, il le conserverait tel quel. Il est important pour moi de distinguer 1.12300 de 1.123. Si j'utilise PaddingForm, Mathematica l'enregistrerait littéralement sous la forme PaddedForm[1.123, {4, 5}] dans un fichier texte.

+0

Il est important de comprendre qu'un nombre tel que "11.12", une fois saisi ou renvoyé en résultat, est un nombre à virgule flottante représenté par une précision machine, et n'est plus "exactement" 1112/100. Vous devriez aller à mathematica.stackexchange.com pour plus d'informations, mais faites une recherche il y a littéralement des douzaines de questions similaires. – agentp

Répondre

0

Utilisez

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"] 

pour obtenir

1.12300 11.12 111.123 
2.1  22.123 222.0 

Si vous ne voulez pas entrer vos données comme un ensemble de chaînes, vous devez Précisez l'exactitude de vos données en utilisant ``. Voir le tutoriel Numerical Precision par Mathematica.

0

Quelque chose comme ça?

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

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

Afin de préserver les zéros sur des nombres tels que 1.12300 les données doivent être reçues sous forme de chaîne. Ensuite, il peut être traité comme ça.

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

Oui, il génère cet exemple, mais le problème est que le format à largeur fixe doit utiliser des espaces plutôt que des tabulations. Malheureusement, c'est un format commun dans les données d'astronomie. En outre, le code ne fonctionnerait pas correctement si je change le premier élément à 1.12300000. – Miladiouss

+0

@mpourrah Aucun problème pour implémenter le format à largeur fixe si vous écrivez la spécification. Le rembourrage est intéressant - un problème qui revient souvent. Comment les colonnes doivent-elles être formatées si le premier nombre est 1.12300000? –

+0

Je suppose que je peux trouver quel élément de chaque colonne a le plus grand nombre de caractères. – Miladiouss