Hallo zusammen,
ich traue mich es kaum zu fragen: Kann man mit SAS folgende Zahl einlesen?
6.3565654996227266482910694597574421E-06
Wenn ja: Mit welchem Informat?
Die Zahl liegt in einer CSV-Datei vor und ist dort mit '"'-Zeichen ("Gänsefüßchen") maskiert.
Per Google bin ich nicht fündig geworden. Die numerischen Formate sind auf 32 Zeichen begrenzt, so dass ich bei der Breite der Zahl vermute, dass dies so nicht so einfach möglich ist.
Zur Not muss ich die Zahl als Text einlesen und dann nach "E" scannen, um selber zu rechnen. Aber das ist natürlich fehleranfällig und umständlich.
Andere Zahlen aus der Eingabedatei (ohne "E") lassen sich einlesen, z.B.:
-.00042565614666475080712238147739801544
(Allerdings natürlich nicht alle Nachkommastellen!)
Vielen Dank vorab!
Das muss man zuerst als Character lesen und dann konvertieren:
data want;
infile datalines dsd;
input string :$50.;
if indexc(string,'E') > 18
then string = substr(string,1,18) !! substr(string,indexc(string,'E'));
number = input(string,32.);
format number best32.;
datalines;
"6.3565654996227266482910694597574421E-06"
"-.00042565614666475080712238147739801544"
;
Das muss man zuerst als Character lesen und dann konvertieren:
data want;
infile datalines dsd;
input string :$50.;
if indexc(string,'E') > 18
then string = substr(string,1,18) !! substr(string,indexc(string,'E'));
number = input(string,32.);
format number best32.;
datalines;
"6.3565654996227266482910694597574421E-06"
"-.00042565614666475080712238147739801544"
;
Danke @Kurt_Bremser für die schnelle Antwort!
Das hatte ich leider "befürchtet".
Aber der Code ist ja überschaubar und damit haben wir eine gute Lösung in der Hinterhand für den Notfall.
Einlesen wird schon ein antwort bekommen.
Die frage ist welche genauhigheit benotigt ist. Ich sehe en lange reihe ciffern. Bei 12 - vorsicht.
http://de.saswiki.org/images/c/cc/20_KSFE_2016_Lehrkamp_-_Nicht_jede_Zahl_ist_das_was_sie_zu_sein_sc...
Hallo, @CKothenschulte,
am einfachsten, finde ich, geht es ohne Informat:
data want;
infile datalines dsd;
input number;
datalines;
"6.3565654996227266482910694597574421E-06"
"-.00042565614666475080712238147739801544"
;
(Die DSD-Option sorgt dafür, dass die Anführungszeichen nicht stören.)
Wenn man unbedingt ein Informat angeben will, kann man das Standard-Informat w.d verwenden:
input number :1.;
Beim (modifizierten) List-Input wird ja die angegebene Informat-Länge (hier: 1) sowieso nicht benutzt und kann sogar weggelassen werden. Für Letzteres muss man hier mangels Buchstaben im Informatnamen auf einen Alias von w.d ausweichen, z. B. Ew.d:
input number :e.;
Wow, wieder was gelernt!
Vielen Dank @FreelanceReinh!
Abschließend noch die Info, dass (bei beiden Varianten) Nachkommastellen abgeschnitten werden:
data want;
infile datalines dsd;
attrib number format=32.29;
input number;
put number;
datalines;
"6.3565654996227266482910694597574421E-06"
"-.00042565614666475080712238147739801544"
;
/*
0.00000635656549962273000000000
-0.00042565614666475000000000000
*/
run;
data want;
infile datalines dsd;
input string :$50.;
if indexc(string,'E') > 18
then string = substr(string,1,18) !! substr(string,indexc(string,'E'));
number = input(string,32.);
format number 32.29;
put number;
datalines;
"6.3565654996227266482910694597574421E-06"
"-.00042565614666475080712238147739801544"
;
/*
0.00000635656549962272000000000
-0.00042565614666475000000000000
*/
run;
Im Kommentar sieht man die Ausgabe des PUT-Befehls aus dem Log.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!