Formatierung beim Einlesen

Ähnliche Dokumente
Hallo Jessi, wenn ich das. DATA aufg3_b; vari='<.0001'; IF &wil_two_test. le vari THEN pwert=0.0001;

Einlesen von Textdateien mit sehr langen Zeilen

rechtsbündige Leerzeichen mit einlesen im Datastep

Wie kann ich die Ausgabe als Excel speichern?

viele ähnliche Datensätze automatisch einlesen

QMF Tabelle Q.OBJECT_DATA in DB2

Alter berechnen mit Base SAS

Dateneingabe und Transformation Übersicht

Umbenennung von Spaltennamen über Schleife(n)

Fehlermeldung, wenn Anzahl der %do der %end entspricht - was läuft falsch?

Dynamisch Makros aufrufen

Auslesen von SAS Systeminformationen über die aktuelle Log- Ausgabe

Kreuztabelle als Data-Set so wie aus proc tabulate

Zeilen in SAS-Datensatz einfügen

Ermittlung der übereinstimmenden Variablen (-Namen) zweier Datasets

Berechnung der Arbeitstage

IMPORT / EXPORT Access

News Artikel Foren Projekte Links Über Redscope

Exportieren in excel sheets

SPDS-Problem - proc summary auf View mit by-variable - Sortierung wird verlangt

Übersicht Shell-Scripten

Excel sheet input / Zufallsgenerator/ Excel sheet output

Wie überprüfen, ob eine Datei existiert?

Anhang zur Frage Data statement und Proc Statement

SAS-Online Dokumentation: zu finden über Internetsuche nach sas online documentation

Failed to transcode data from U_UTF8_CE to U_LATIN9_CE?!

Achsenbeschriftung um 90 drehen

Zugriff aus Oracle via Proc SQL: Performanceprobleme

PROC GCHART HBAR Zeilenumbruch in Achsenbeschriftung

Langfassung des Beitrags für die 11. KSFE

Import von XLS-Dateien aus einem Ordner in eine SAS-Datei

Datenformat zum Import von CSV-Dateien

Institut für Computational Science Prof. Dr. H. Hinterberger. Praxismodul 1. Einführung in die Programmierung Erste Programme

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

NICHT TRIVIAL: MAKROVARIABLEN - GLOBAL ODER LOKAL

Programmieren in Haskell

Vorkurs Informatik WiSe 16/17

Informatik I. Übung 2 : Programmieren in Eclipse. 5. März Daniel Hentzen

Strings. Daten aus Dateien einlesen und in Dateien speichern.

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Programmieren in Haskell Einstieg in Haskell

Programmieren lernen in ASP.NET mit C#

1 Aufgaben 1.1 Objektorientiert: ("extended-hamster") Sammel-Hamster

Welche Informatik-Kenntnisse bringen Sie mit?

Übersicht. Einführung in Perl Datenstrukturen I. Datentypen Übersicht (1) Kernbegriffe. Kernbegriffe. Einführung der Datentypen.

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Übersicht PERL. !!!! Wichtig: Nach dem Befehl einem Strichpunkt setzen!!!!

Eine simple Gedankenstütze zur richtigen Anwendung von SAS Formaten/Informaten

Programmierkurs Python I

JAVA-Datentypen und deren Wertebereich

Grundlagen der Programmierung

GI Vektoren

Elementare Datentypen in C++

Datumsangaben, enthält mindestens Jahr, Monat, Tag

FH München, FB 03 FA WS 06/07. Ingenieurinformatik. Name Vorname Matrikelnummer Sem.Gr.: Hörsaal Platz

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Programmieren in C/C++ und MATLAB

SAS Daten per Remote SUBMITE vom Großrechner selektieren,

Wütschner Preisdatei, Preisdatei Format Konverter und Excel-Import

01 Einführung in PHP. Einführung in PHP 1/13 PHP in Aktion

Der SAS DataStep und die Prozedur SQL Cellent Finance Solutions GmbH Seite: 1

Handbuch zur Bearbeitung des Einzelgesprächsnachweises In elektronischer Form (CSV-Datei).

Computer & GNU/Linux Einführung Teil 4

SMS Alarmierung Benutzerhandbuch

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

Programmierkurs Python I

Datenformat zum Import von CSV-Dateien

FuxMedia GmbH & Co. KG Bautzner Straße Dresden

Shell-Scripting Linux-Kurs der Unix-AG

Laufzeitoptimierung bei der Verknüpfung großer Datenmengen Ein Vergleich zwischen MERGE und JOIN

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

IDE Grundlagen Vektoren Matrizen Faktoren Dataframes Visualisierung Tips. Quick & dirty

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

2017/01/23 15:50 1/5 Bedienung

Steuern des GSR-Interface mit QBasic

System.out.println("TEXT");

Erweiterung der Selektionen

Programmsteuerung mit PHP - if/else, elseif,switch

Informatik B von Adrian Neumann

Eine JAVA Einführung ... Quellcode:... COMA Übung 3. T.Bosse. A.Griewank. Vorschau JAVA Programme Sprachen Kate

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

EiP Übung

Processing Info zu Variablen und Bedingungen

Übungsblatt 2. Abgabe: Freitag, 7. November 2014, 18:00 Uhr

FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren

MEHR FUNKTIONEN, MEHR E-COMMERCE:

Handbuch Datenpunktliste - Auswerte - Tools

Grundlagen. Wie sind PHP-Dateien aufgebaut?

Anleitung zum GEPA EXCEL Import Tool

Klausur in 12.1 Themen: Zahlsysteme, Grundlagen von Delphi (Bearbeitungszeit: 90 Minuten)

Beschreibung: Erforderliches Programm: Excel (97)2000 bis 2007

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Bash-Scripting Linux-Kurs der Unix-AG

Transkript:

News Artikel Foren Projekte Links Über Redscope Join List Random Previous Next Startseite Foren ETL & Base SAS Formatierung beim Einlesen 9 May, 2007-15:04 Caroline Ich habe hier ja schon mein oder anderes Problem zum Einlesen von Files beschrieben und auch immer viel Hilfe und gute Lösungen bekommen. Jetzt bin ich soweit, das ich eine beliebige Datei mit einer beliebigen Anzahl an Variablen einlesen kann und komme sogar mit dem umbenennen klar. Ein Problem habe ich leider noch und das ist das Format. Da zwischen den einzelnen Text Feldern auch immer wieder Felder auftauchen die einen Zahlenwert beinhalten, also float oder integer. Da die SAS Dataset auch für Statistiken verwendet sollen, wäre es also blöd das so zu lassen. Hier mal der komplette Code wie er grad ausschaut: *liest die erste Zeile ein; DATA lesenzumzaehlen; INFILE 'J:\BIO\CDM\initiator\test\dose.txt' OBS=1 LRECL=10000; INFORMAT string $10000.; FORMAT string $10000.; INPUT string $; DATA strings(drop=instring); SET lesenzumzaehlen(rename=(string=instring)); n=1; LENGTH string $10000; DO WHILE(scan(instring,n,';') ne ''); string = SCAN(instring,n,';'); OUTPUT; n=n+1; END; DROP string; n=n-1; PUT n=; CALL SYMPUT('anzahl',n); %MACRO HEAD; DATA Kopf; INFILE 'J:\BIO\CDM\initiator\test\dose.txt' obs=1; LENGTH %DO i=1 %TO &anzahl; X&i $60 %END; header2 $5000; INPUT %DO i=1 %TO &anzahl; X&i $ %END;; %LET header=trim(left(x1)); %DO i = 2 %TO &anzahl; &header &i

%LET header=&header!!";"!!trim(left(x&i.)); %END; %PUT &header; header=&header; call symput('header',header); DATA BODY; INFILE 'J:\BIO\CDM\initiator\test\dose.txt' firstobs=2; LENGTH %DO i=1 %TO &anzahl; X&i $60 %END;; INPUT %DO i=1 %TO &anzahl; X&i $ %END;; %DO i = 1 %TO &anzahl; %LET h&i.=%scan(&header,&i.); %PUT &&h&i.; %END; DATA umbenennen; set body; RENAME %DO i=1 %TO &anzahl; X&i.=&&h&i. %END; ; %MEND HEAD; %HEAD; Foren: ETL & Base SAS Wann ist eine Variable numerisch? 9 May, 2007-20:03 AndreasMangold Eigentlich ist genau das (erkennen, welche Spalten welchen Datentyp haben und die Daten entsprechend einlesen) die Aufgabe von PROC IMPORT. Das verwenden Sie nicht, weil es bei Ihnen nicht so funktioniert, wie es soll (das wurde diskutiert unter PROC IMPORT). Jetzt programmieren Sie PROC IMPORT nach. Das Einlesen beliebiger alphanumerischer Variablen im DATA-Schritt funktioniert schon einmal (zumindest solange deren Länge nicht größer als 60 ist). Der nächste Schritt ist die Erkennung, welche Variablen numerisch sind. Dazu muss man ein Kriterium formulieren, wie zum Beispiel "eine Variable ist dann numerisch, wenn in den ersten 10 oder 100 oder in allen Zeilen der entsprechenden Spalte nur Zeichenketten stehen, die SAS als Zahlen erkennen kann, andernfalls alphanumerisch". Ist es das, was Ihnen vorschwebt? Die Alternative wäre ein Anruf bei der SAS-Hotline mit dem Ziel, das PROC-IMPORT-Problem zu lösen.

Genau das, Genau das ist es was mir in etwa vorschwebt. 10 May, 2007-10:05 Caroline Mir kam der Gedanke, alles als Zahl einzulesen und mit einer Rechnung zu überprüfen ob es auch eine Zahl ist und wenn es keine Zahl ist, als Text einzulesen. Weil ohne Einlesen kann ich ja nicht mit dem Wert arbeiten, oder? Nur weiß ich nicht, bzw. glaube nicht das SAS Text einfach so als Zahl einlesen kann. Hab es gerade ausprobiert und er meckert nicht und bei einer PROC PRINT gibt er anschließend den Text als Missing aus. Würde es dann gehen wenn ich Frage, wenn missing dann wandle es in Text um oder lese es neu ein? Dann würde evtl. die Rechnung wegfallen. proc Import 10 May, 2007-10:54 Nikolas Aggelidakis Sparen Sie sich die Mühe und nehmen Sie proc import. Den Link auf den Hotfix habe ich im proc-import-thread hinterlegt. Grüsse, Nikolas Aggelidakis Geht alles und ist gar nicht soooo schwer!!! Hallo, ich habe gerade ein anderes (dringenderes) Problem, aber es gilt: Geht alles und ist gar nicht soooo schwer!!! Muster: Einlesen als char, prüfen ob numerisch (s.u.) falls num: umwandeln von char nach num (s.u.) 10 May, 2007-13:33 HansKneilmann Details: 1. "prüfen ob numerisch" Geht ganz einfach mit translate und compress. Mit translate() tauscht man die gültigen Zeichen 0-9 und, oder. und + bzw. - gegen blanc. Mit compress löscht man alle blanc. Wenn jetzt noch Zeichen in der Variable sind, dann sind sie unzulässig, also KEIN num. btrxx=compress(translate(btr,' ','.,+-0123456789')); if btrxx ne '' then do; file log; put "INFO: Mist gefunden"; 2. "wenn numerisch. dann umwandeln von char nach num" Geht auch einfach mit input(), aber nur wenn OK, sonst meckert das input() und das ist meist doof! So geht es:

btrxx=compress(translate(btr,' ','.,+-0123456789')); if btrxx ne '' then do; status2="mist gefunden"; file log; put "INFO: " status2=; else do; /* Wert wird ohne Dezimal-Stellen übergeben, char 0 nach num 0 if compress(translate(_btr(ii),' ','.,+-0123456789')) eq '' then do; /* input() nur wenn OK */ btr(ii)=input(_btr(ii), comma12.); /* char 0 nach num /* Komma-Fall: Wert mit Komma übergeben, char 0,00 nach num 0 * if compress(translate(_btr(ii),' ','.,+-0123456789')) eq '' then do; /* input() nur wenn OK */ btr(ii)=input(_btr(ii), commax12.); /* char 0,00 nach num /* Punkt-Fall: Wert mit Punkt übergeben, char 1.23 nach num 1,2 if compress(translate(_btr(ii),' ','.,+-0123456789')) eq '' then do; /* input() nur wenn OK */ btr(ii)=input(_btr(ii), comma12.); /* char 0.00 nach num /* Minus-Fall: Wert rumdrehen, wenn Minus irgendwo im Feld */ if indexc(btr(ii), '-') then btr(ii)=-btr(ii); /* mal -1 f. Min Einen vollständigen Code, der mit allem Mist zurechtkommt (mit leer, mit Nach-Komma- Stellen ioder ohne, die Komma-Stellen mit Komma oder Punkt getrennt [also 123.456,78 bzw. 123,456.78]) und das ohne Warning von SAS und so doofe Sachen habe ich, kann ich bei Bedarf/Interesse (und Zeit von mir) bekannt geben. Hintergrund war bei uns die Übergabe von Daten aus R3. R3 kennt als Format das Nachfolgende Minus. Wir haben kein SAS-Eingabeformat gefunden und das Minus- Problem dann "zu Fuß" gelöst. Danach kam irgendwann dass Tausender- Punkte/Tausender-Komma-Problem hinzu... Jetzt ist es auch gelöst. Proc import kam bei uns nie zum Zuge, da es Teil der PC- FSP-Lizenz ist (nice to have) und unser DWH aber nur eine (teure) Server-BASE-Lizenz (=Maschinenklasse C = viiiiieeele Euros )hat. Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) Umsetzung des Prinzips 15 May, 2007-12:00 Caroline Hallo, ich habe gerade versucht deinen Code an mein Problem anzupassen, komme aber nicht so recht weiter. Ich lese alle Variablen als Text ein und prüfe mit "compress" und "translate" ob sie numerisch sind. Da die Variable eine Zahl sein muss, wenn diese nach "compress" und "translate" keinen Inhalte mehr hat. Nur das mit dem Format wechseln klappt noch nicht so, da er beim Datentyp Text bleibt und alle Hilfvariablen Datentyp Zahl werden. Hier de Code:

%MACRO Test; DATA BODY; INFILE 'J:\BIO\CDM\initiator\test\demo.txt' firstobs=2; informat X1 $15. X2 $4. X3 $3. X4 $3. X5 $9. X6 $12. X7 $6. X informat X9 $2. X10 $17. X11 $3. X12 $3. X13 $10. X14 $13. X1 format X1 $15. X2 $4. X3 $3. X4 $3. X5 $9. X6 $12. X7 $6. X8 format X9 $2. X10 $17. X11 $3. X12 $3. X13 $10. X14 $13. X15 input X1 $ X2 $ X3 $ X4 $ X5 $ X6 $ X7 $ X8 $ X9 $ X10 $ X11 %DO i=1 %TO 16; hilf&i=compress(translate(x&i,' ','.,+-0123456789')) %if hilf&i eq '' %then %do; hilf&i=input(hilf&i, comma12.); % %END;; %MEND TEST; %TEST; put hilf&i; Es ist sicher hilfreich... 15 May, 2007-12:54 Nikolas Aggelidakis zum Erlernen von SAS/Base, wenn Sie das hier bis zum Ende durchexerzieren. Ansonsten würde ich Ihnen den einfacheren Weg empfehlen: Installieren Sie den Hotfix 82BC24 und importieren Sie ihre Daten mit proc import. SAS abgeschossen 15 May, 2007-13:59 Caroline Wir haben letzte Woche Freitag versucht den Hotfix aufzuspielen unter Berücksichtung der Reihenfolge die Sas vorgibt. Und bei der gelegenheit direkt noch die anderen Hotfixe aufgespielt die uns fehlen. Doch leider hat genau der 82BC24 SAS so zerschoßen, das ein einfaches zurückspielen von Sas nicht gereicht hat und der Server neu gebootet werden musste. So wie das aussieht.. 15 May, 2007-15:11 Nikolas Aggelidakis... ist in Ihrer SAS Installation grundsätzlich der Wurm drin. Ich empfehle Ihnen, SAS komplett neu aufzusetzen. Wenn Sie dann das aktuelle SAS Hotfix-Bundle 82BX09 installieren, müssen Sie den Hotfix 82BC24 nicht mehr einspielen, da der proc import- Fehler durch einen früheren Hotfix (82BB24) entstanden war, der aber in 82BX09 nicht mehr enthalten ist. Klingt verwickelt, ist aber halt so.

Problem beim Umsetzen des Prinzips 15 May, 2007-15:30 HansKneilmann Hallo Caroline, wieder einmal gilt: das Thema "Macro-Variablen zur Data Step Laufzeit" ist ein hartes Brot (siehe Beitrag Maro-Variablen zur Data Step Laufzeit von HansKneilmann, 22. März 2007,12:19 als Kommentar zu Deinem schon etwas älteren Forums-Beitrag "PROC IMPORT")... Konkret hast Du die BASE-Variable X1 konvertiert in die BASE-Variable hilf1 umgewandelt (ok), dann machst Du eine MACRO-Abfrage mit einer BASE- Variablen in der Bedingung. Das KANN nicht gut gehen. Die Macro-Utilty "sieht": hilf&i und vergleicht das mit dem String ' ' (Gänsfüßchen Blanc Gänsfüßchen)... Na ja, das der String hilf1 verschieden ist zum String Gänsfüßchen Blanc Gänsfüßchen sieht ja jeder :-)... Bitte beachten: MACRO-Code läuft VOR dem BASE-Code!!! Die BASE-Code-Zuweisung hilf&i=compress(translate(x&i,' ','.,+- 0123456789')) (bei der das Abschluß-Semikolon fehlt!!!) erfolgt erst zum späteren Zeitpunkt, NACH dem Bearbeiten vom MACRO-Code. (alles klar?) %MACRO test; data BODY; INFILE 'J:\BIO\CDM\initiator\test\demo.txt' firstobs=2 ; informat X1 $15. X2 $4. X3 $3. X4 $3. X5 $9. X6 $12. X7 informat X9 $2. X10 $17. X11 $3. X12 $3. X13 $10. X14 $1 format X1 $15. X2 $4. X3 $3. X4 $3. X5 $9. X6 $12. X7 $6 format X9 $2. X10 $17. X11 $3. X12 $3. X13 $10. X14 $13. input X1 $ X2 $ X3 $ X4 $ X5 $ X6 $ X7 $ X8 $ X9 $ X10 %DO ii=1 %TO 16; /* hier MACRO-Code, als Ersatz für da * von 16 fast gleichen 5er-Gruppen B */ hilf&ii=compress(translate(x&i,' ','.,+-0123456789')); if hilf&ii eq '' then do; /* alles BASE-Code!!! */ hilf&ii=input(hilf&ii, comma12.); put hilf&ii; /* wieder: BASE-Code! */ %END; run; %mend TEST; %TEST; Wie geasgt: Das Thema "Macro-Code zur Data Step Laufzeit" ist ein hartes Brot... Aber (zum Trost): Remember,

Man always wins in the end! (Although UNIX/SAS/COBOL/... may stretch your endurance to the limit) Das ist ein uralter Spruch, den ich 'mal (irgendwann im vorigen Jahrhundert) in einem Unix-Handbuch gefunden hatte, und eben an SAS angepasst habe. Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) gehe zwei Schritte zurück Hallo, 16 May, 2007-15:03 Caroline bin jetzt mal zwei Schritte zurückgegangen. Habe die Datei auf zwei Variablen reduziert. Eine ist Typ Text und die andere Typ Zahl. Habe außerdem den Makro rausgeworfen, der aber später wenn wieder rein müsste. Hier schreibe ich in hilf1, den Rest was von X1 übrig bleibt nachdem compress und translate rübergelaufen sind und mit dem Put kommt es zur Kontrolle ins Log-Fenster. Im if prüfe ich auf nicht gleich leer. Diese Bedingung müsste ja jetzt erfüllt sein zumindest beim Datentyp Text (X1). Das Feld (X2) das den Datentyp Zahl hat müsste leer sein und die Änderung müsste ja durchgeführt werden. Was passiert eigentlich hier in der Zeile? hilf1=input(x1, comma12.); Ich habe da nur eine Vermutung das die Variable X1 in Zahl umgewandelt wird, warum soll das dann in hilf gespeichert werden?

DATA BODY; INFILE 'J:\BIO\CDM\initiator\test\demo_form.txt' firstobs=2; informat X1 $15. X2 $4.; format X1 $15. X2 $4.; input X1 $ X2 $; hilf1=compress(translate(x1,' ','.,+-0123456789')); put hilf1; if compress(translate(x1,' ','.,+-0123456789')) ne '' th status2="textvariable"; put "INFO X1: " status2=; else do; if compress(translate(x1,' ','.,+-0123456789')) eq '' hilf1=input(x1, comma12.); hilf2=compress(translate(x2,' ','.,+-0123456789')); put "hilf2: "hilf2; if compress(translate(x2,' ','.,+-0123456789')) ne '' th status2="textvariable"; put "INFO X2: " status2=; else do; if compress(translate(x2,' ','.,+-0123456789')) eq '' hilf2=input(x2, comma12.); Grüße SAS-Doku hilft (egal ob Online oder Papier) 16 May, 2007-17:24 HansKneilmann Hallo, die Anweisung hilf1=input(x1, comma12.); macht genau dass was oben im meinem Beitrag bei der Anweisung btr(ii)=input(_btr(ii), comma12.); steht, nämlich: char 0 nach num 0 konvertieren. Siehe auch SAS-Online-Dok, Stichworte "Format", "COMMAw.d". Bitte beachten: Das Format mit dem Du konvertierst muss zu Deinen Daten passen: Zahlen (US,CH,..), mit Dezimal-Punkt und 1000er-Kommata: "COMMAw.d" Zahlen (deutsche), mit Dezimal-Komma und 1000er-Punkten: "COMMAXw.d" Zahlen (deutsche), ohne Nachkommastellen, 1000er-Punkte: "COMMAXw." u.s.w. Deshalb habe ich in meinem Code-Stück mehrere Fälle zur Auswahl, was

nicht passt muss man rauslöschen. Siehe auch die Kommentar-Zeilen Wert wird ohne Dezimal-Stellen übergeben Komma-Fall: Wert mit Komma übergeben Punkt-Fall: Wert mit Punkt übergeben (Im produktiven Code ist erst die Analyse 'was kommt rein', dann die Konvertierung) Zu "warum soll das dann in hilf gespeichert werden": Um die Eingabe-Daten in der richtigen Variable zu speichern. Nach der Abfrage auf "bist du num" wird die Zuweisung hilf1=input(x1, comma12.); benötigt um die Eingabe-Daten zu konvertieren (ohne lästige Warnung im LOG) und in der richtigen Variable zu speichern, siehe mein Code: btr(ii)=input(_btr(ii), comma12.);, mit _btr(ii) als HILFS- Variable (nur zum einlesen im input-statement und zum testen ob num/char) und btr(ii) als (Speicher-) Variable mit dem richtigen Daten-Typ. Deine Fragestellung war doch: Daten einlesen (egal was kommt) und im richtigen Daten-Typ (char oder num) speichern. Der Code geht flexibel über alle Eingabe-Felder X1 bis Xnn und prüft/konvertiert alle, egal ob manche sowieso immer nur Text enthalten. Dann ist natürlich auch nix zu konvertieren. Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI)