proc import - SAS Support Communities
Transcrição
proc import - SAS Support Communities
News Artikel Foren Join Projekte List Links Random Über Redscope Previous Next Startseite › Foren › Allgemeine Fragen zu SAS PROC IMPORT 15 March, 2007 - 10:08 — Caroline Hallo zusammen, ich habe ein Problem mit dem Importieren einer CSV-Datei. Mein Code sieht wie folgt aus: PROC IMPORT DATAFILE="J:\BIO\CDM\initiator\SAS CONVERSION\Initiator ASCII Data\DEMO.txt" DBMS=DLM OUT=demo REPLACE; delimiter=','; getnames=yes; RUN; Das einlesen der Datei funktioniert, es wird aber folgende Fehlermeldung im Log-Fenster angezeigt: ERROR: Read Access Violation In Task ( Submit ] Exception occurred at (67E58F04) Task Traceback ERROR: Generic critical error. Und wenn ich die einglesene Datei dann öffne erscheint im Log-Fenster diese nette Fehlermeldung: WARNING: End of file on entry VT_PRINTLIST.SLIST. No memory available Arguments passed to FILLIST: 1 (Character Literal) = 'catalog' 2 (Character Literal) = 'sasuser.profile.vt_printList.slist' 3 (Numeric Expression $T3) = 10029 Program returning prematurely at line 372 AF Program: SASHELP.FSP.DATAVIEW.SCL Außerdem habe ich noch eine andere Frage auf dem Herzen. Ich habe bei meinen Recherchen neben der PROC IMPORT auch noch eine PROC CIMPORT gefunden. Wird diese Version des importieren auch verwendet und gibt es einen unterschied zu PROC IMPORT? Ich verwende die SAS Version 8 und freue mich über jeden Hilfe. gruss Foren: Allgemeine Fragen zu SAS Log in or register to post comments Wie sehen die ersten Zeilen 15 March, 2007 - 10:14 — MWendel Wie sehen die ersten Zeilen der Datei aus? Ich würde im vorliegenden Fall 'dbms = csv' angeben. Log in or register to post comments Mh, eigentlich 15 March, 2007 - 10:30 — Caroline Mh, eigentlich ist das mein ganzes Programm. Ich habe nur noch eine Kommentar in den ersten Zeilen stehen. Ich habe das dbms geändert, die Fehlermeldungen sind mir aber erhalten geblieben. Log in or register to post comments EWie sieht die Daten Datei aus? 16 March, 2007 - 09:34 — Martin Schaefer Es würde helfen, wenn Sie eine Zeile einzulesender Daten posten würden. Damit man das Format und die Trennzeichen sieht. Damit wäre es leichter den Syntax für Ihr Programm zu bestimmen. Viele Grüße // Martin Schäfer Log in or register to post comments Auszug aus Datei 16 March, 2007 - 10:11 — Caroline Auszug aus der Datei Demo.txt "STUDY","SUBJECT","SCREENING","ENROLMENT","VOLUNTEER","DATATYPE","OTHERCOMMENTS","BIRTHDATE","SEX","ETHNICGROUP","HEIGHT","WEIGHT","FIRSTNAMES","LASTNAME","KNO "Gummibär","1","S01","E01","80003","Demography","","10-Jul1970","M","Caucasian/White",170.0,69.0,"Grammi","Gummibaer","Grammi","","Gummibär" Die erste Zeile sind die Variablennamen, danach kommt eine Zeile der Daten die eingelesen werden sollen. gruss Log in or register to post comments OK in SAS9.1.3 16 March, 2007 - 20:58 — AndreasMangold Lässt sich in SAS 9.1.3 mit dem von Ihnen verwendeten Programm gut importieren. SAS 8.2 habe ich nicht mehr. Es gibt eine Warnung, weil der Name von Spalte 16 leer ist. Log in or register to post comments Hotfix 15 March, 2007 - 13:14 — AndreasMangold Es gibt SAS-Notes, die in der Version 8 auf ein solches Verhalten hinweisen. Eventuell muss ein Hotfix installiert werden. Setzen Sie sich mit Ihrer Systemverwaltung oder mit der SAS Hotline in Verbindung. Log in or register to post comments Danke für die Info zu dem 15 March, 2007 - 14:05 — Caroline Danke für die Info zu dem CIMPORT. Auf was für einen Hotfix würde die Situation den Hinweisen? Log in or register to post comments Sorry 16 March, 2007 - 08:41 — AndreasMangold Da kann ich leider nicht weiterhelfen, außer Sie auf Ihre Systemverwaltung oder die SASHotline zu verweisen. Oder suchen Sie in den SAS-Notes nach Ihrer Fehlermeldung. Log in or register to post comments PROC CIMPORT 15 March, 2007 - 13:52 — AndreasMangold PROC CIMPORT ist für das Einlesen von Dateien aus einer SAS-Transportdatei da, die mit PROC CPORT erzeugt wurde. Dies verwendet man, wenn man SAS-Dateien eines anderen Betriebssystems oder einer anderen SAS-Version verwendet möchte. Dokumentiert ist CIMPORT hier. Log in or register to post comments Merkwürdig 16 March, 2007 - 10:12 — Caroline Ich habe außerdem noch etwa merkwürdiges festgestellt. Hoffentlich kann ich es so beschreiben, das man es versteht. Wenn ich die Daten mit meinen PROC IMPORT importiere, werden sie zwar richtig eingelesen, danach spielt SAS aber "verrückt" es lässt sich nämlich nicht mehr schließen wenn man es beendet. Man hat dann die Möglichkeit es über den Task-Manager zu beenden oder man geht auf File/Data import dann wird SAS auch geschlossen. gruss Log in or register to post comments SAS steht im Wald 19 March, 2007 - 13:13 — HansKneilmann Hallo, eben habe ich eine ausführliche Antwort geschrieben, leider nicht irgendwo gesichert und das "Kommentar eintragen" ging mit irgendeiner "blöden" (subjektive Anwendersicht) Fehlermeldung schief. Jetzt der 2. Versuch, kurz+knapp: Auch bei mir hängt sich der PROC IMPORT; auf, aber ohne das im Log irgendetwas steht! Das würde ich weder mit "einlesen der Datei funktioniert, ... aber ..." noch mit "werden ...zwar richtig eingelesen, danach ... aber" bezeichnen, sondern mit: Es funktioniert nicht! Unsere Erfahrung ist: Es gibt bei SAS kein "halb richtig"! Jede klitze kleine Fehler-Meldungchen muss beachtet und abgestellt werden, sonst Chaos (oder Fehler)! Wenn es im Display Manager von SAS nicht klappt, dann gibt es zum Glück noch den BatchBetrieb, der garantiert eine LOG-DAtei liefert! Im Batch-Modus (mit c:\sas\sas.exe -sysin c:\tmp\demo.sas) gestartet und vorher die Daten aus "Caroline, 16. März 2007, 10:11" nach c:\tmp\demo.dat kopiert ergibt die LOG-AusgabeDatei c:\tmp\demo.log und c:\tmp\demo.lst: Inhalt von c:\tmp\demo.log 4 5 PROC IMPORT DATAFILE="c:\tmp\demo.dat" 5 6 7 8 9 10 11 DATAFILE="c:\tmp\demo.dat" DBMS=DLM OUT=demo REPLACE; delimiter=','; getnames=yes; RUN; Name "" is not a valid SAS name. Problems were detected with provided names. See LOG. 12 /********************************************************************** 13 * PRODUCT: SAS 14 * VERSION: 8.2 15 * CREATOR: External File Interface 16 * DATE: 19MAR07 17 * DESC: Generated SAS Datastep Code 18 * TEMPLATE SOURCE: (None Specified.) 19 ***********************************************************************/ 20 data WORK.DEMO ; 21 %let _EFIERR_ = 0; /* set the ERROR detection macro variable */ 22 infile 'c:\tmp\demo.dat' delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ; 23 informat STUDY $10. ; 24 informat SUBJECT $3. ; 25 informat SCREENING $5. ; 26 informat ENROLMENT $5. ; 27 informat VOLUNTEER $7. ; 28 informat DATATYPE $12. ; 29 informat OTHERCOMMENTS $2. ; 30 informat BIRTHDATE $13. ; 31 informat SEX $3. ; 32 informat ETHNICGROUP $17. ; 33 informat HEIGHT best32. ; 34 informat WEIGHT best32. ; 35 informat FIRSTNAMES $8. ; 36 informat LASTNAME $11. ; 37 informat KNOWNAS $8. ; 38 informat VAR16 $2. ; 39 informat RECRUITERGROUP $10. ; 40 format STUDY $10. ; 41 format SUBJECT $3. ; 42 format SCREENING $5. ; 43 format ENROLMENT $5. ; 44 format VOLUNTEER $7. ; 45 format DATATYPE $12. ; 46 format OTHERCOMMENTS $2. ; 47 format BIRTHDATE $13. ; 48 format SEX $3. ; 49 format ETHNICGROUP $17. ; 50 format HEIGHT best12. ; 51 format WEIGHT best12. ; 52 format FIRSTNAMES $8. ; 53 format LASTNAME $11. ; 54 format KNOWNAS $8. ; 55 format VAR16 $2. ; 56 format RECRUITERGROUP $10. ; 57 input 58 STUDY $ 59 SUBJECT $ 60 SCREENING $ 61 ENROLMENT $ 62 VOLUNTEER $ 63 DATATYPE $ 64 OTHERCOMMENTS $ 65 BIRTHDATE $ 66 SEX $ 67 ETHNICGROUP $ 68 HEIGHT 69 WEIGHT 70 FIRSTNAMES $ 71 LASTNAME $ 72 KNOWNAS $ 73 VAR16 $ 74 RECRUITERGROUP $ 75 ; 76 if _ERROR_ then call symput('_EFIERR_',1); /* set ERROR detection macro variable 76 ! */ 77 run; NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column). 76:44 NOTE: The infile 'c:\tmp\demo.dat' is: File Name=c:\tmp\demo.dat, RECFM=V,LRECL=32767 NOTE: 5 records were read from the infile 'c:\tmp\demo.dat'. The minimum record length was 0. 3 The SAS System The maximum record length was 141. NOTE: The data set WORK.DEMO has 5 observations and 17 variables. NOTE: DATA statement used: real time 0.01 seconds cpu time 0.01 seconds 13:11 Monday, March 19, 2007 5 rows created in WORK.DEMO from c:\tmp\demo.dat. NOTE: WORK.DEMO was successfully created. NOTE: PROCEDURE IMPORT used: real time 0.37 seconds cpu time 0.06 seconds Inhalt von c:\tmp\demo.lst 13:11 Monday, March 19, 2007 The SAS System anzeigen 1 The CONTENTS Procedure Data Set Name: Member Type: Engine: Created: WORK.DEMO DATA V8 13:11 Monday, March 19, 2007 Last Modified: 13:11 Monday, March 19, 2007 Protection: Data Set Type: Label: Observations: Variables: Indexes: Observation Length: 5 17 0 136 Deleted Observations: 0 Compressed: Sorted: NO NO -----Engine/Host Dependent Information----Data Set Page Size: Number of Data Set Pages: First Data Page: Max Obs per Page: Obs in First Data Page: Number of Data Set Repairs: File Name: Release Created: Host Created: 12288 1 1 90 5 0 C:\DOKUME~1\KNEILM~1\LOKALE~1\Temp\SAS Temporary Files\_TD1972\demo.sas7bdat 8.0202M0 WIN_PRO -----Alphabetic List of Variables and Attributes----# Variable Type Len Pos Format Informat ----------------------------------------------------------------8 BIRTHDATE Char 13 60 $13. $13. 6 DATATYPE Char 12 46 $12. $12. 4 ENROLMENT Char 5 34 $5. $5. 10 ETHNICGROUP Char 17 76 $17. $17. 13 FIRSTNAMES Char 8 93 $8. $8. 11 HEIGHT Num 8 0 BEST12. BEST32. 15 KNOWNAS Char 8 112 $8. $8. 14 LASTNAME Char 11 101 $11. $11. 7 OTHERCOMMENTS Char 2 58 $2. $2. 17 RECRUITERGROUP Char 10 122 $10. $10. 3 SCREENING Char 5 29 $5. $5. 9 SEX Char 3 73 $3. $3. 1 STUDY Char 10 16 $10. $10. 2 SUBJECT Char 3 26 $3. $3. 16 VAR16 Char 2 120 $2. $2. 5 VOLUNTEER Char 7 39 $7. $7. 12 WEIGHT Num 8 8 BEST12. BEST32. Ich denke, das dem PROC IMPORT; die Daten nicht gefallen. Entweder zu viele Felder oder zu viele Gänsefüßchen oder ... Mein Tipp: Abspecken und schrittweise dem Problem bzw. der Lösung nähern... Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) Log in or register to post comments Leere Spaltenüberschrift 19 March, 2007 - 13:40 — AndreasMangold Das Problem scheint zu sein, dass eine leere Spaltenüberschrift vorhanden ist in Spalte 16. Darauf weist die Meldung 'Name "" is not a valid SAS name.' ja auch hin. Log in or register to post comments Leere Spaltenüberschrift ist es nicht 19 March, 2007 - 14:35 — HansKneilmann hallo, die Leere Spaltenüberschrift ist es nicht. Ich habe das Leer gegen den Text Schrott ersetzt. Im Batch klappt es fehlerfrei. Im DMS scheint es fehlerfrei zu laufen (Bildschirm-Kopie siehe hier), aber wenn man z.B. in das OUT-Fenster klickt oder ins LOG-Fenster, sieht man: SAS hängt(Bildschirm-Kopie siehe hier)! Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) Log in or register to post comments Hi 19 March, 2007 - 14:50 — Caroline Also das es an der leeren Spaltenüberschrift nicht liegt kann ich bestätigen, habe diese einfach mal rausgenommen und nochmal versucht das ganze einzulesen. Habe auch schon verschiedene andere Varianten ausprobier und zwar, das rauslöschen der Anführungszeichen, das reduzieren der Spaltenanzahl auf 2 oder als Trennzeichen ein Semikolon und kein Komma. Aber das alles hat nicht funktioniert, der alte Fehler ist mir erhalten geblieben. Log in or register to post comments SAS Classic 20 March, 2007 - 07:37 — HansKneilmann Hallo, wenn das mein Problem wäre, dann würde ich es der SAS-Hotline melden. Ausserdem würde ich natürlich die Finger von leeren Spalten-Überschriften lassen. Und zu guter letzt: Ich würde mich auf "SAS Classic" zurückziehen, den PROC IMPORT; dort lassen wo der Pfeffer wächst und die Chose zu Fuß machen! Das hört sich schlimmer an als es ist! Der Trick liegt darin, dass das SAS den Code generiert und ausführt und sich erst danach aufhängt. Der Code, den man zum Einlesen benötigt wird, wenn man SAS im Batch startet, ordentlich im LOG protokolliert (siehe oben im Beitrag HansKneilmann, 19. März 2007, 13:13, dort findet man auch den LOG und kann ihn nutzen). Alles was zu tun ist: Den Code aus dem LOG rauskopieren, alles überflüssige löschen und als normalen SAS-Base-Code im Editor-Fenster wegschicken. Ca va. Der Einlese-Code aus dem LOG sieht so aus: %let _EFIERR_ = 0; /* set the ERROR detection macro variable */ data WORK.DEMO; infile 'c:\tmp\demo_daten.txt' /* Pfad ist anzupassen !!!! */ delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ; informat STUDY $13. ; informat SUBJECT $3. ; informat SCREENING $5. ; informat ENROLMENT $5. ; informat VOLUNTEER $7. ; informat DATATYPE $12. ; informat OTHERCOMMENTS $6. ; informat BIRTHDATE $13. ; informat SEX $3. ; informat ETHNICGROUP $17. ; informat HEIGHT best32. ; informat WEIGHT best32. ; informat FIRSTNAMES $10. ; informat LASTNAME $13. ; informat KNOWNAS $10. ; informat Schrott $9. ; informat RECRUITERGROUP $10. ; format STUDY $13. ; format SUBJECT $3. ; format SCREENING $5. ; format ENROLMENT $5. ; format VOLUNTEER $7. ; format DATATYPE $12. ; format OTHERCOMMENTS $6. ; format BIRTHDATE $13. ; format SEX $3. ; format ETHNICGROUP $17. ; format HEIGHT best12. ; format WEIGHT best12. ; format FIRSTNAMES $10. ; format LASTNAME $13. ; format KNOWNAS $10. ; format Schrott $9. ; format RECRUITERGROUP $10.; input STUDY $ SUBJECT $ SCREENING $ ENROLMENT $ VOLUNTEER $ DATATYPE $ OTHERCOMMENTS $ BIRTHDATE $ SEX $ ETHNICGROUP $ HEIGHT WEIGHT FIRSTNAMES $ LASTNAME $ KNOWNAS $ Schrott $ RECRUITERGROUP $ ; if _ERROR_ then do; /* set ERROR detection macro variable */ call symput('_EFIERR_',"1"); end; run; proc contents data=demo; /* Test-Ausgabe */ run; proc print data=demo(obs=9); /* Test-Ausgabe */ run; Das neumodische SAS-Zeugs ist halt manchmal etwas zickig .... Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) Log in or register to post comments Habe schon 20 March, 2007 - 08:32 — Caroline Habe auch schon damit angefangen es ohne die PROC IMPORT einzulesen und das läuft bis jetzt auch ganz ordentlich. Ich möchte mich für die viele Hilfe die ich hier bekommen habe gerne bei allen bedanken die mir geholfen haben. Log in or register to post comments SAS-Classic für XLS-Import möglich? Hallo 26 June, 2007 - 17:15 — marcosch dieser Threat ist zwar schon älter, aber auch ich bin von dem hängenden Verhalten von SAS bei PROC IMPORT (und seltener sogar auch PROC EXPORT) betroffen. Normale CSV oder Text-Dateien lese ich inzwischen auch immer in der "Classic"-Form ein. Dort kann ich dann ja auch vernünftige Formate festlegen. Was aber, wenn ich nur eine XLS-Datei habe. Die kann ich doch nur mit einem PROC IMPORT einlesen, oder? Einen DATA-Step hierfür gibt es doch nicht, denke ich? Gruß aus Hamburg Marco Schmidt Log in or register to post comments XLS-Datei einlesen 27 June, 2007 - 09:46 — HansKneilmann Hallo Marco, wenn das SAS die Lizenz dazu hat, dann geht es genau so wie oben (Beitrag HansKneilmann, 20. März 2007, 07:37) beschrieben: Der Trick liegt darin, dass das SAS den Code generiert und ausführt (..). Mit der Recall-Funktion lässt sich der generierte Code in das PGM-Fenster holen, oder man schaut im LOG, dort wird generierte Code ordentlich protokolliert. Man braucht nur den Code aus dem LOG rauskopieren, alles überflüssige löschen und als normalen SAS-Base-Code im Editor-Fenster wegschicken. Ob der Trick wirklich klappt kann ich nicht sagen, da die Lizenz nicht haben. Wir können keine XLS-Datei lesen. Aber jede Wette: Der Trick klappt! Gruß aus dem Westerwald Hans Kneilmann, Schäfer Shop GmbH (SSI) Nachtrag: Bitte überlegen, den "Kontakt über Redscope" freizuschalten: Im Benutzerprofil muß (leider) jede/jeder unter Bearbeiten, dort ziemlich weit unten bei "Kontakteinstellungen" das Kästchen vor "Persönliches Kontaktformular" anklicken. Ich fände es schöner, wenn das die defaultEinstellung wäre, aber da hätten vielleicht andere eine andere Meinung dazu, also bleibt nur: Dran denken (und zur Not: dran erinnern). Siehe auch Eine Bitte an die Forumsmitglieder und Ergänzung zur "Bitte an Alle" Log in or register to post comments Die Wette verlierst Du :-) 28 June, 2007 - 18:34 — marcosch Hallo Hans, ich habe den "Kontakt über Redscope" nun freigeschaltet. Danke für den Hinweis. Leider generiert SAS aus dem PROC IMPORT für Excel-Dateien keinen Dataset-Code o.ä. Im Log wird lediglich die das ausgeführte PROC IMPORT ausgegeben: 228 PROC IMPORT OUT= WORK.tst 229 DATAFILE= 229! "\\Corp.XY\public\Projekte\Stammdaten V0.8.xls" 230 DBMS=EXCEL2000 REPLACE; 231 RANGE="Daten_Vertragsbesonderheiten"; 232 GETNAMES=YES; 233 RUN; NOTE: WORK.TST was successfully created. Trotzdem danke für den Tipp. Für TXT, CSV und ähnliche Dateien behält er ja seine Gültigkeit. Gruß aus Hamburg Marco Schmidt Log in or register to post comments schade 29 June, 2007 - 12:37 — HansKneilmann wäre schön gewesen :-() Hans Kneilmann, Schäfer Shop GmbH (SSI) Log in or register to post comments Inhalte an Macrovariable übergeben Hi, 20 March, 2007 - 16:57 — Caroline Da ich jetzt die Datei (später mehrere Dateien) in einem DATA STEP einlese und eigentlich nicht weiß wieviele Variablen in einer Datei stehen lese ich erst die erste Zeile ein, in der alle Spaltenüberschriften stehen. Im Input habe ich zum einlesen erstmal nichtssagende Variablennamen die nur temporär vorhanden sein sollen. Um jetzt mit RENAME die nichtsagende Variable umzubenennen versuche ich erstmal Ihren Inhalt (den der nichtsagenden Variable) in eine Hilfsvariable zu schreiben. DATA test; SET demohead; hilf = &X1; RENAME X1 = &hilf; RUN; Und genau hier liegt der Hund begraben, da nicht der Inhalt übergeben wird sondern wer weiß was. Ist das & überhaupt das richtige Zeichen zum übergeben? Und wenn ja bleibt es auch im Macro das Zeichen der Wahl um den Variableninhalt zu ändern? gruss Log in or register to post comments Maro-Variablen zur Data Step Laufzeit 22 March, 2007 - 12:19 — HansKneilmann Hallo, das Thema "Maro-Variablen zur Data Step Laufzeit" ist ein hartes Brot. Man sollte sich sehr intensiv mit dem Zusammenspiel des Macro Compilers mit der 'eigentlichen' SAS-Base-Sprache beschäftigt haben, bevor man an solche Aufgabenstellungen rangeht. Ansonsten gilt die einfache Faustregel: Macro-Variablen sind ein Ersatz für getippten Code und die Ersetzung der Macro-Variable gegen ihren Inhalt findet vor der Ausführung des Data Steps statt, also bevor die SAS-Base-Sprache drankommt. Nur weil beide Sprachen mit 'SAS' beginnen darf man nicht denken, dass die SAS-Base-Sprache und die SAS-Macro-Sprache dasselbe wären ... Um die Verwirrung noch ein bisschen zu steigern habe ich hier noch ein klitzekleines Beispiel wie man zur Data-Step-Laufzeit Macro-Variablen auslesen kann, die man zur Data-Step-Laufzeit gesetzt hat: data test; X1='123'; CALL SYMPUT('hilf',X1); X2='456'; x2=SYMGET('hilf'); /* siehe SAS Macro Language, Reference, */ /* Chap. 13 Macro Language Dictionary, p. 222 */ put x1= x2=; run; Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) Log in or register to post comments Hotfix einspielen 10 May, 2007 - 10:47 — Nikolas Aggelidakis Hallo, dieser Fehler tritt auf, wenn Hotfix 82BB24 oder 82BX04 eingespielt wurde. Zur Behebung bitte Hotfix 82BC24 einspielen. Dieser Hotfix findet sich nicht im aktuellen SAS/Base Hotfix-Bundle 82BX09! Ich habe Ihren Beispielcode mit Ihren Daten und SAS 8.2 getestet. Es lief einwandfrei durch. Grüsse, Nikolas Aggelidakis. Log in or register to post comments