Import von Text-Dateien. Einzelne Wörter einlesen.

Wie kann ich in SAS eine Text-Datei einlesen, so dass beim einlesen nur ein Wort statt eine ganze Zeile eingelesen wird?

Folgenden Code habe ich dazu benutzt:

DATA A;
INFILE probe DLM = ' ';
INPUT Text $255.;
RUN;

das ergebnis sieht dann so aus:
wort1 wort2 wort3
wort4 wort5
wort6 wort7 wort8 wort9
usw.
ich hätte ea aber ganz gerne so:
wort1
wort2
wort3
usw.

Das funktioniert mit @@

Wenn die Textdatei "probe.txt" folgenden Inhalt hat,

Wie kann ich 
in SAS eine Text-Datei 
einlesen,
so dass beim einlesen nur ein Wort 
statt eine ganze Zeile eingelesen wird?
Folgenden Code habe ich dazu benutzt

dann bewirkt @@ im INPUT-Statement,

FILENAME probe 'probe.txt';
DATA A;
INFILE probe DLM = ' ';
INPUT wort $ @@;
RUN;

PROC PRINT; RUN;

dass jedes Wort einzeln gelesen wird:

                                         Obs    wort

                                           1    Wie
                                           2    kann
                                           3    ich
                                           4    in
                                           5    SAS
                                           6    eine
                                           7    Text-Dat
                                           8    einlesen
                                           9    so
                                          10    dass
                                          11    beim
                                          12    einlesen
                                          13    nur
                                          14    ein
                                          15    Wort
                                          16    statt
                                          17    eine
                                          18    ganze
                                          19    Zeile
                                          20    eingeles
                                          21    wird?
                                          22    Folgende
                                          23    Code
                                          24    habe
                                          25    ich
                                          26    dazu
                                          27    benutzt

vielen, vielen Dank! es

vielen, vielen Dank! es klappt jetzt endlich! Allerdings schneidet er manche Wörter, die etwas länger sind, ab.

sorry, so klappt es jetzt

sorry, so klappt es jetzt aber einwandfrei.
Vielen Dank noch mal!

DATA A;
FORMAT Text $255.;
INFILE probe DLM = ' ';
INPUT Text @@;
RUN;

jetzt habe ich aber noch ein

jetzt habe ich aber noch ein weiteres Problem:
leere Zeilen werden auch eingelesen, und lassen sich gar nicht so einfach mit

IF Text NE '';

entfernen.

Option flowower sollte

Option flowower sollte funktionieren;

FILENAME probe 'H:\my documents\probe.txt';
DATA A;
length wort $256;
infile probe flowover ;
INPUT wort $ @@ ;
;
RUN;

PROC PRINT; RUN;

Hallo, Muschik, mit FLOWOVER

Hallo, Muschik,

mit FLOWOVER klappt es leider nicht.

Vermutlich sind nicht-alphanumerische Zeichen im Text enthalten

Probieren Sie doch bitte mal folgendes aus:

DATA A;
FORMAT wort $255.;
INFILE probe DLM = ' ';
INPUT wort @@;
IF ANYCNTRL(wort) THEN
DO;
PUT 'found controlchar';
DELETE;
END;
RUN;

Wenn im Log die Meldung "found controlchar" aufscheint, sind im Text nichtdarstellbare Codes enthalten, die SAS aber trotzdem einliest.

Die DELETE-Anweisung müsste solche Fälle dann eigentlich alle rauswerfen.

Klappt es dann zu Ihrer Zufriedenheit? Wenn nicht, gibt es noch weitere Möglichkeiten.

Ach ja, wenn Sie $255. als Format angeben, reserviert SAS 255 Stellen für ein Wort. Das ist eigentlich ein bisschen viel und unter Performanz-Aspekten betrachtet sogar viel zu viel. Ohne Format sind es maximal 8, das hatte ich übersehen.

Vielen Dank für den Hinweis

Vielen Dank für den Hinweis über das Format. Das habe ich jetzt auf 20 eingestellt.

Es funktioniert - leere Zeilen werden gelöscht. Nur auch einige Wörter werden dabei entfernt.

Nachtrag:
das Problem lässt sich auf folgende Weise lösen:

IF ANYCNTRL(text) = 1 THEN DELETE;

Dabei stört es mich trotzdem, dass es im Text Wörter gibt, die als nichtdarstellbare Codes bezeichnet werden.
Denn ich muss die Tabelle mit DISTINCT-Befehl sortieren, so dass jedes Wort nur einmal vorkommt. Dabei kommen einige Wörter nach dieser DISTINCT-Sortierung zweimal vor, weil eins davon normal eingelesen wird, und das andere - als nicht nichtdarstellbare Code.

Ist die Textdatei formatiert?

Schön, das es mit Ihrer Programmzeile jetzt halbwegs klappt! :)

Für das weitere Problem stellt sich mir inzwischen die Frage, ob ihr Text auf eine bestimmte Art formatiert ist und nicht lediglich eine reine Textdatei im sogenannten ASCII-Format ist, wie ich ursprünglich angenommen hatte. Handelt es sich z.B. um eine MS-Word-Datei? Vielleicht können Sie kurz schildern, wie Sie zu Ihrer Textdatei gekommen sind.

Mit nichtdarstellbarem Code meinte ich nicht Wörter, sondern Zeichen (Codes) in der Datei, die z.B. dazu dienen, das Zeilenende zu kennzeichnen, aber keinem alphanumerischen Zeichen unseres Alphabets zugeordnet sind. Leider habe ich Ihre Datei nicht, sonst könnte ich mit einem speziellen Programm, einem sogenannten Hex-Editor, nachsehen, welche Codes in Ihrer Datei enthalten sind.

Ihr Problem mit den doppelten Worten könnte darin bestehen, dass beide Worte gar nicht identisch sind, weil eines davon, für Sie unsichtbar, weil nicht darstellbar, am Ende einen oder mehrere Codes enthält. Sie können das prüfen, indem Sie Ihr Programm wie folgt ergänzen:

Wortlaenge = LENGTHN(wort);
IF ANYCNTRL(text) = 1 THEN DELETE;

Lassen Sie sich dann bitte den Inhalt anzeigen:

PROC PRINT; RUN;

Im Output wird Ihnen für jedes Wort angezeigt, wie viele Zeichen es in SAS umfasst. Sind die doppelten Worte unterschiedlich lang?

Hallo, Norbert.R, Sie

Hallo, Norbert.R,
Sie hatten recht, das Zeilenende war der Grund.
Das Problem ließ sich leicht lösen:

Text = TRANSLATE(Text, '', '0D'X);

Vielen Dank noch mal für Ihre Hilfe! :-)

Hallo, bei mir funktioniert

Hallo,

bei mir funktioniert folgendes prima, ich habe dann auch keine Probleme mit Zeilenenden, leeren Einträgen etc. . Allerdings ist dieses Programm ja auch eine reine Textdatei

/*
isn't (Hochkomma als Teil des Worts)
Text-Datei (Bindestrich als Teil des Worts)
Wie kann ich
in SAS eine Text-Datei
einlesen,
so dass beim Einlesen nur ein 'Wort',
statt einer ganzen Zeile, eingelesen wird?
Folgenden Code habe ich dazu benutzt:
*/

FILENAME probe 'Eigene Dateien\test.sas'; /*Dieses Programm*/
%LET trenner = ' ,;.?!"%&/\=$§+*~#|<>:@()[]{}^° '; /*Alles auf der
Tastatur außer ' und - */

DATA A;
FORMAT wort $256.;
INFILE
Probe
DLM = &Trenner.
LRECL = 32767
;
INPUT wort $ @@;
/* (unvollständige) Sonderbehandlung von Problemfällen */
IF wort IN ("'", "''", "-") THEN DO;
/* einzelnes Hochkomma oder zwei direkt direkt aufeinanderfolgende oder einzelnes - */
DELETE;
END;
ELSE IF PRXMATCH("/'.+'/", wort) THEN DO;
/* 'Wort' wird von Hochkommas eingeschlossen*/
wort=PRXCHANGE("s/'(.+)'/\1/", 1, wort);
END;
ELSE IF SUBSTR(wort,1,1) = "'" THEN DO;
/* Hochkomma am Anfang des 'Worts */
wort = SUBSTR(wort,2);
END;
ELSE IF SUBSTR(wort,LENGTH(wort),1) = "'" THEN DO;
/* Hochkomma am Ende des Worts' */
wort = SUBSTR(wort,1,LENGTH(wort)-1);
END;
RUN;

/* Maximale Länge eines Worts betimmen */
PROC SQL NOPRINT;
SELECT MAX(LENGTH(wort)) INTO :MaxLaenge FROM A;
QUIT;

/* Wort entsprechend kürzen */
DATA A;
FORMAT wort $&MaxLaenge..;
INFORMAT wort $&MaxLaenge..;
SET A;
RUN;

/* Doppelte rausschmeißen und sortieren*/
PROC SORT
DATA = A
OUT = B
SORTSEQ = LINGUISTIC (
COLLATION = PHONEBOOK
)
NODUPKEY
;
BY WORT;
RUN;

/*
Bleibt noch das Problem
der Groß- und Kleinschreibung,
der verschiedenen Formen,
der Zahlen,
des Bindestrichs,
...
*/

Schöne Grüße

Jan