rechtsbündige Leerzeichen mit einlesen im Datastep

Hallo, wahrscheinlich sehe ich den Wald vor lauter Formaten nicht mehr...

eigentlich ein ganz simples Problem: Ich habe eine Datei, die ich Zeile für Zeile einlesen möchte.
Die Datei hat eine feste Länge pro Zeile (=&LRECL).

Nun sind in der Zeile rechts aber noch ein paar Leerzeichen, die auch in eingelesen werden sollen. Leider entfernt SAS die Spaces immer :-( Ich hab nun schon so viele Varianten mit und ohne INFORMAT und unterschiedlichster Syntax des INPUT ausprobiert... aber das Richtige hab ich nicht getroffen.

DATA WORK.DAT;
INFILE FILEIN TRUNCOVER;
INFORMAT ZEILE $CHAR&LRECL..;
INPUT @1 ZEILE 1-&LRECL. ;
RUN;

Laut Hilfe soll das ansich mit dem Informat $CHARw. und dem formatierten einlesen klappen, aber irgendwie geht das auch nicht...

Ich nutze noch SAS 8.2 (!).

Wenn mir da jemand die Augen öffnen könnte... :-)

Danke und Gruß aus Hamburg
Marco Schmidt

Hallo Marco, SAS füllt

Hallo Marco,

SAS füllt Textvariablen vom Ende eines Textes bis zum Ende des Variablenpuffers mit Leerzeichen auf. Es genügt also, eine Textvariable mit der gewünschten Länge anzulegen, und dann die Variable einzulesen. Es ist dann aber nicht möglich, die aufgefüllten Leerzeichen von den eingelesenen zu unterscheiden

Wenn Du wissen willst, wieviel Leerzeichen noch hinten dran kommen, musst Du die Länge der Einlesezeile mit der Länge des eingelesenen Textes vergleichen oder noch eine Endemarkierung hinzufügen.

%Let LRECL=40;
data test;
length text $ &Lrecl.;
infile test length = laenge;
input text $varying. Laenge;
AnzLeer = Laenge - lengthn(Text);
run;

/* oder Endemarkierung */

%Let LRECL=42;
data test;
length text $ &Lrecl.;
infile test;
input ;
Text = "'" ||_INFILE_ || "'";
run;

Schöne Grüße

Jan

klappt nicht ganz

Hallo Jan, danke für Deine schnelle Antwort.

Leider hilft das mir nur etwas weiter. Füre ich nun rechts etwas an, sehe ich, dass dort tatsächlich noch Leerzeichen rechts sind. Sobald rechts aber ausschließlich Leerzeichen sind, schneidet SAS die ab :-(

Ziel ist es übrigens, einen Dataset vom Host als Textdatei auf den PC zu transferieren. In der Zieldatei sollen dann auch wieder Leerzeichen rechts vorhanden sein.

Hier mal das gesame Macro zur Kenntnis:

%MACRO HOST2PC(DSN=,DATEI=,LRECL=150);
%SYSLPUT DSN=&DSN.;
%SYSLPUT LRECL=&LRECL;
PROC DATASETS NOLIST LIB=WORK; DELETE DAT; QUIT;
RSUBMIT;
PROC DATASETS NOLIST LIB=WORK; DELETE DAT; QUIT;
FILENAME FILEIN MVS "&DSN" DISP=SHR;
DATA WORK.DAT;
length ZEILE $ &Lrecl.;

INFILE FILEIN TRUNCOVER length=laenge;
input ZEILE $varying&LRECL.. laenge;
Zeile2 = Zeile || "<";
z1=length(Zeile);
z2=length(Zeile2);
RUN;
FILENAME FILEIN CLEAR;
PROC DOWNLOAD DATA=WORK.DAT; RUN;
/* PROC DATASETS NOLIST LIB=WORK; DELETE DAT; QUIT;*/
ENDRSUBMIT;

OPTIONS XSYNC NOXWAIT;
%LET CMD=%UNQUOTE(%STR(%') MKDIR "&PFAD" %STR(%'));
%IF %SYSFUNC(FILEEXIST("&PFAD"))=0 %THEN %DO;
DATA _NULL_; X = SYSTEM(&CMD); PUT X=; RUN;
%END;

FILENAME OUTFILE "&DATEI." lrecl=&LRECL;
DATA _NULL_;
FILE OUTFILE;
SET WORK.DAT;
PUT ZEILE;
RUN;
FILENAME OUTFILE CLEAR;
/* PROC DATASETS NOLIST LIB=WORK; DELETE DAT; QUIT;*/
%MEND;

Hallo Marco, ich kenne mich

Hallo Marco,

ich kenne mich mit SAS im Server-Client Betrieb nicht aus, aber bei der Proc Download steht in der Hilfe, dass man damit auch externe Dateien transportieren kann. In der Hilfe unter SAS/CONNECT User's Guide - Data Transfer Services - Proc Download steht folgendes Beispiel, um alle SAS-Programme vom Verzeichnis "/local/programs" auf dem Host auf einen Windowsclient ins Verzeichnis "C:\" zu kopieren.

filename locref 'c:\';
rsubmit;
filename fref '/local/programs';
proc download infile=fref('*.sas')
outfile=locref;
run;
endrsubmit;

Mit dieser Methode dürfte es eigentlich keine Probleme mit den Leerzeichen mehr geben.

Schöne Grüße

Jan

Coole Variante, aber...

Die Variante mit dem PROC DOWNLOAD ist nicht schlecht. Wusste ich gar nicht, das das auch klappt...

Vielen Dank dafür!

...allerdings schneidet auch der PROC DOWNLOAD die rechtsbündigen Leerzeichen ab. Selbst, wenn ich die LRECL mitgebe

Das Problem bleibt leider bestehen.

Gruß aus HH
Marco

Binary Option

Hallo Marco,

ich hatte die Hilfe nur überflogen. SAS versucht die Textdateien zwischen den verschiedenen Systemen anzupassen. Dabei werden vermutlich auch vermeintlich überflüssige Leerzeichen entfernt. Um eine exakte Kopie zu erstellen musst Du die Option Binary hinzufügen.


BINARY
specifies that you want to download a binary image (an exact copy) of an external remote host file. Use this option only for downloading external files.


The BINARY option prevents record delimiters from being inserted at each host record. In addition, if the remote host uses a different method of data representation, the BINARY option prevents any data translation such as conversion from EBCDIC to ASCII. See The BINARY Option for more information.

Das Beispiel aus der Hilfe:

proc download infile=hostmod
outfile='external-file-name' binary;
run;

Falls Du es doch im Datastep machen möchtest, da du teilweise Übersetzungen wünscht, aber nicht bei den Leerzeichen kannst du auch folgenden Code verwenden.

%Let LRECL=40;
data test;
length text $ &Lrecl.;
infile test length = len;
input text $varying. Len;
Laenge = Len;
run;
data _null_;
set test;
file test;
put text $varying. Laenge;
run;

Schöne Grüße

Jan

Kein BINARY verwenden!

Hallo,
von der binary-Option kann ich nur abraten, denn die Daten sollen vom richtigen Host auf einen PC übertragen werden.
Der richtige Host arbeitet mit der EBCDIC Codierung und Windows (und Unix) mit ASCII. Wenn man die Text-Datei vom Host zum PC binär überträgt ist danach nur noch Kauderwelsch drin!

Siehe Hilfe-Text (Koie aus vorigem Beitrag):

The BINARY option prevents record delimiters from being inserted at each host record. In addition, if the remote host uses a different method of data representation, the BINARY option prevents any data translation such as conversion from EBCDIC to ASCII.

Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)