PROC IMPORT

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

Hotfix einspielen

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.

Inhalte an Macrovariable übergeben

Hi,

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

Maro-Variablen zur Data Step Laufzeit

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)

Merkwürdig

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

SAS steht im Wald

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 Batch-Betrieb, 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-Ausgabe-Datei c:\tmp\demo.log und c:\tmp\demo.lst:
Inhalt von c:\tmp\demo.log

4 PROC IMPORT
5 DATAFILE="c:\tmp\demo.dat"
6 DBMS=DLM
7 OUT=demo
8 REPLACE;
9 delimiter=',';
10 getnames=yes;
11 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 13:11 Monday, March 19, 2007

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

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

The SAS System                    13:11 Monday, March 19, 2007   1
anzeigen

The CONTENTS Procedure

Data Set Name: WORK.DEMO                 Observations:         5  
Member Type:   DATA                      Variables:            17
Engine:        V8                        Indexes:              0  
Created:       13:11 Monday,             Observation Length:   136
               
March 19, 2007                                     
Last Modified: 13:11 Monday,             Deleted Observations: 0  
               
March 19, 2007                                     
Protection:                              Compressed:           NO
Data Set Type:                           Sorted:               NO
Label:                                                            


           -----Engine/Host Dependent Information-----

Data Set Page Size:         
12288                                 
Number of Data Set Pages:   1                                     
First Data Page:            1                                     
Max Obs per Page:           90                                    
Obs in First Data Page:     5                                     
Number of Data Set Repairs: 0                                     
File Name:                  C:\DOKUME~1\KNEILM~1\LOKALE~1\Temp\SAS
                            Temporary Files\_TD1972\demo.sas7bdat
Release Created:            
8.0202M0                              
Host Created:               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)

Leere Spaltenüberschrift

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.

Leere Spaltenüberschrift ist es nicht

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)

Hi

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.

SAS Classic

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)

SAS-Classic für XLS-Import möglich?

Hallo

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

XLS-Datei einlesen

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 default-Einstellung 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"

Die Wette verlierst Du :-)

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

schade

wäre schön gewesen :-()
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Habe schon

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.

PROC CIMPORT

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.

Hotfix

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.

Danke für die Info zu dem

Danke für die Info zu dem CIMPORT.

Auf was für einen Hotfix würde die Situation den Hinweisen?

Sorry

Da kann ich leider nicht weiterhelfen, außer Sie auf Ihre Systemverwaltung oder die SAS-Hotline zu verweisen. Oder suchen Sie in den SAS-Notes nach Ihrer Fehlermeldung.

Wie sehen die ersten Zeilen

Wie sehen die ersten Zeilen der Datei aus?
Ich würde im vorliegenden Fall 'dbms = csv' angeben.

Mh, eigentlich

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.

EWie sieht die Daten Datei aus?

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

Auszug aus Datei

Auszug aus der Datei Demo.txt

"STUDY","SUBJECT","SCREENING","ENROLMENT","VOLUNTEER","DATATYPE","OTHERCOMMENTS","BIRTHDATE","SEX","ETHNICGROUP","HEIGHT","WEIGHT","FIRSTNAMES","LASTNAME","KNOWNAS","","RECRUITERGROUP"
"Gummibär","1","S01","E01","80003","Demography","","10-Jul-1970","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

OK in SAS9.1.3

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.