Import von Text-Dateien. Einzelne Wörter einlesen.
Verfasst von bezNika am 28 April, 2009 - 09:14
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;
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.
»
- Anmelden oder Registrieren um Kommentare zu schreiben

Das funktioniert mit @@
Wenn die Textdatei "probe.txt" folgenden Inhalt hat,
dann bewirkt @@ im INPUT-Statement,
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 benutztvielen, 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!
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
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:
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:
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:
IF ANYCNTRL(text) = 1 THEN DELETE;
Lassen Sie sich dann bitte den Inhalt anzeigen:
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:
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