LesezeichenAbonnierenRSS-Feed abonnieren
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
CKothenschulte
Obsidian | Level 7

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!

1 AKZEPTIERTE LÖSUNG

Akzeptierte Lösungen
Kurt_Bremser
Super User

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

Lösung in ursprünglichem Beitrag anzeigen

6 ANTWORTEN 6
Kurt_Bremser
Super User

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"
;
CKothenschulte
Obsidian | Level 7

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.

jakarman
Barite | Level 11

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...

---->-- ja karman --<-----
FreelanceReinh
Jade | Level 19

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.;

 

CKothenschulte
Obsidian | Level 7

Wow, wieder was gelernt!

Vielen Dank @FreelanceReinh!

CKothenschulte
Obsidian | Level 7

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.

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

Diskussionsstatistiken
  • 6 Antworten
  • 2021 Aufrufe
  • 10 Kudos
  • 4 in Unterhaltung