Re: I want to read numbers written in E-format.
- To: mathgroup at yoda.physics.unc.edu
- Subject: Re: I want to read numbers written in E-format.
- From: "Tyler Perkins" <perkins at spot.colorado.edu>
- Date: Mon, 20 Dec 93 11:56:07 MST
Peter Whaite wrote: >I have programs that write Mma expressions to a file. I bring this file into >Mma using Get. Unfortunately there are numbers in the file which are >sometimes in e-format, so e.g. 1.234e+456 gets parsed as 456 + 1.234*e. >ReadList can handle e-format numbers but I can't use it. You didn't say what kind of system you're using, but if it's a Unix machine, you can use the following sh script I wrote for just this purpose. Using printf(), I find it convenient to have my C programs output data in Mathematica format. E.g.: y = { 0.1, 2.345e7, -8.9e-11 } After executing "sci2mma filename" from the shell, I can just use << to Get the data into Mathematica. My script uses the utility "mktemp". In case your system doesn't have mktemp, I've also included a version I wrote which will suffice. Have fun! Tyler Perkins perkins at spot.colorado.edu Boulder, CO - - - - - - - - - - - - - - - - - - cut here - - - - - - - - - - - - - - - - #!/bin/sh # NAME # sci2mma - Scientific to Mathematica Format converter # # SYNOPSIS # sci2mma [ -nobuffer ] [ file ] ... # # DESCRIPTION # sci2mma acts as a filter or file conversion utility to convert # occurrences of strings of the form "1.234e-5" to "1.234*10^-5 . # Thus a text file produced by a program written in C, Fortran, # etc., may be used as input to Mathematica using its Get[..] # function. # # When called with no filename arguments, sci2mma takes the # standard input as input and sends its output to the standard # output. If called with filename arguments, each file is # modified as described above. # # The option -nobuffer may be used when there are no filename # arguments to ensure that sci2mma immediately processes each # line as it is received from standard input, sending the # resulting line immediately to standard output. This is much # slower than not using the -nobuffer option. sedcmd='s/\([0-9\.]\)[eE]\([0-9\+\-]\)/\1*10^\2/g' useBuffer=true if [ "$1" = "-nobuffer" ] then shift useBuffer=false fi if [ "$*" = "" ] then if $useBuffer then sed $sedcmd else # Read a line, then make substitution. We do this one line at a # time to ensure that sci2mma sends a line of output immediately # after a line of input. This is much slower because of the need # to start up and exit a sed process for each line of input. IFS='' while read aLine do echo $aLine | sed $sedcmd done fi else temp=`mktemp` for f in $* do sed $sedcmd $f >$temp cp $temp $f done rm $temp fi - - - - - - - - - - - - - - - - - - cut here - - - - - - - - - - - - - - - - #!/bin/sh # mktemp # # Make a temporary filename. This utility attempts to duplicate the # function of mktemp as found on other systems such as Ultrix. dir="/tmp" prfx="$USER" create=false while [ "$1" != "" ] do case $1 in -d) shift dir="`echo $1 | sed 's!\(.*\)/$!\1!'`" shift continue ;; -p) shift prfx=$1 shift continue ;; -c) shift create=true continue ;; *) echo 'mktemp usage: mktemp [-d directory] [-p prefix] [-c]' exit 1 ;; esac done name="$dir/$prfx.$$`date | sed 's/.*:\(..\):\(..\).*/\1\2/'`" # If file with name $name already exists, recurse until not. if [ -f $name -o -d $name ] then name="`mktemp`" fi if $create then >$name else echo $name fi exit 0