12
$\begingroup$

With a text file with entries formatted as (output from C++):

f[38.67] = -2.5387862698183892298317350539374412777263289550697e-05;
⋮

Is there a way to read this into Mathematica? It seems to be getting confused with the e, thinking it is just a symbol e.

$\endgroup$
  • 4
    $\begingroup$ Related: mathematica.stackexchange.com/questions/1737/… $\endgroup$ – cormullion Nov 22 '12 at 13:08
  • 1
    $\begingroup$ When reading Python output in the past I have once or twice done a global replacement of e with *^. That seems like the easiest approach if you have this file already in place. $\endgroup$ – Oleksandr R. Nov 22 '12 at 14:59
  • $\begingroup$ Could be, is there an automated way to get Mathematica to do this? I am going to have lots of files in this format..(I was thinking about changing the output of c++ code to non scientific but it's not too easy with the MPFR data type and c++ wrapper I am using) $\endgroup$ – fpghost Nov 22 '12 at 15:19
  • 1
    $\begingroup$ Alternatively, you could Get the file via a pipe, preprocessing it with sed or similar. $\endgroup$ – Oleksandr R. Nov 22 '12 at 15:30
  • 4
    $\begingroup$ Perhaps something like <<"!sed 's/e/*^/gI' < file.m"? Obviously you should be careful when doing this if you have other occurrences of "e" in the file. $\endgroup$ – Oleksandr R. Nov 22 '12 at 15:47
10
$\begingroup$

Similar to Rolf's method:

string = "f[38.67]=-2.5387862698183892298317350539374412777263289550697e-05;";

StringReplace[string, {"e+" :> "*^", "e-" :> "*^-"}];

ToExpression@%;

?? f
Global`f

f[38.67] = -0.000025387862698183892298317350539374412777263289550697

Depending on your data you may want a more specific pattern, e.g.:

StringReplace[string,
  {a : NumberString ~~ "e" ~~ b : NumberString :> a <> "*^" <> b}]
| improve this answer | |
$\endgroup$
  • 3
    $\begingroup$ Regex fun: StringReplace[string, RegularExpression["e([+-]?)(\\d+)"] :> "*^$1$2"] $\endgroup$ – J. M.'s discontentment Nov 23 '12 at 2:43
  • $\begingroup$ @J.M. you are a glutton for punishment, aren't you! $\endgroup$ – Oleksandr R. Nov 24 '12 at 20:39
  • $\begingroup$ @Oleksandr... but I like regexes! :D Also, I like the generality: it can handle all of "2.9e5", "1.7e+2", and "3.16e-3". $\endgroup$ – J. M.'s discontentment Nov 25 '12 at 1:22
5
$\begingroup$

Import usually automatically converts the e format to powers of. You can use ImportString with the "Table" or "List" type:

ImportString["-2.5387862698183892298317350539374412777263289550697e-05", "Table"]

{{-0.000025387862698183892298317350539374412777263289550697}}

or

ImportString["1.002e-26", "Table"]

{{1.002*10^-26}}

| improve this answer | |
$\endgroup$
  • $\begingroup$ thanks, but what if I want the input to initialize this function f rather than just reading the RHS values and putting them in a list? $\endgroup$ – fpghost Nov 22 '12 at 13:29
  • $\begingroup$ I had previously just been using Get to do this. $\endgroup$ – fpghost Nov 22 '12 at 14:21
2
$\begingroup$

For those wishing to transform a full data file with numbers in scientific notation that is output from Fortran (or C, et al.) as "1.6E-19" and "3.0E+08" and such, it is incredibly faster to make changes in the Unix sed command line editor than doing a search and replace in the .m file within Mathematica or any word processor. At the Unix prompt $ one types

$ cat FilewE.m | sed 's/E-/*^-/g' | sed 's/E+/*^+/g' > FilewoE.m

For those new to Unix, the cat command "concatenates" a single file (named FilewE.m in this example), which normally would flow the contents onto the terminal screen. Instead the flow is piped | into sed and, to avoid killing off any Es that appear in words, E- is replaced with *^- globally g. The output of that is piped into sed again to catch the positive exponents and the output of that is directed > to the output file named FilewoE.m in this example.

| improve this answer | |
$\endgroup$

Not the answer you're looking for? Browse other questions tagged or ask your own question.