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