Hallo zusammen,
ich möchte in einem Infile Statement mehr als 32767 Zeichen einlesen. Anbei der "normale" Code, der nach 32767 Zeichen den Rest einfach abschneidet. Hat jemand eine Idee, wie man alle Zeichen einlesen kann? ...eventuell, dass der bisher abgeschnittene Rest einer weiteren SAS-Variablen oder in einer neuen SAS-Zeile gespeichert wird?!
Danke
Hendrik
%let url2Crawl = http://stores.ebay.de/Fraulein-Frohlich/_i.html?rt=nc%nrstr(%nrstr(&_sid))=1162449139%nrstr(%nrstr(&_trksid))=p4634.c0.m14.l1513%nrstr(%nrstr(&_pgn))=1;
filename crawler3 url "&url2Crawl";
data url(compress=char);
infile crawler3 length=len lrecl=100000 encoding='utf-8';
input lines $varying32767. len;
run;
Logausgabe:
NOTE: 153 records were read from the infile CRAWLER3.
The minimum record length was 0.
The maximum record length was 79057.
NOTE: The data set WORK.URL has 153 observations and 1 variables.
NOTE: Compressing data set WORK.URL decreased size by 90.91 percent.
Compressed is 2 pages; un-compressed would require 22 pages.
NOTE: DATA statement used (Total process time):
real time 2.07 seconds
cpu time 0.03 seconds
Hi!
Sowas kann man eigentlich nur lösen, indem man die Daten stückweise in einen Buffer liest und aus dem heraus parst, da die maximal erwartbare Satzlänge über dem liegt, was man als Character in SAS definieren kann.
zB man definiert mehrere Strings, definiert das Infile mit truncover und liest alle Variablen ein.
Etwa so:
%macro read_long(infile,outfile,buflen,numbufs);
%let lrecl=%eval(&buflen*&numbufs);
data &outfile (compress=yes);
infile "&infile" lrecl=&lrecl truncover;
length
%do i = 1 %to &numbufs;
char&i $&buflen
%end
;
input
%do i = 1 %to &numbufs;
char&i $&buflen..
%end;
;
run;
%mend;
Hallo Kurt,
vielen vielen Dank für deine schnelle Antwort. Es hat funktiert!!!
%let url2Crawl = http://stores.ebay.de/Fraulein-Frohlich/_i.html?rt=nc%nrstr(%nrstr(&_sid))=1162449139%nrstr(%nrstr(&_trksid))=p4634.c0.m14.l1513%nrstr(%nrstr(&_pgn))=1;
filename crawler3 url "&url2Crawl";
%macro read_long(outfile=,buflen=,numbufs=);
%let lrecl=%eval(&buflen*&numbufs);
data &outfile (compress=yes);
infile crawler3 lrecl=&lrecl truncover encoding='utf-8';
length %do i = 1 %to &numbufs; char&i $&buflen.. %end;;
input %do i = 1 %to &numbufs; char&i $&buflen.. %end;;
run;
%mend;
%read_long(outfile=url,buflen=32767,numbufs=3);
Aber bitte 🙂
Du kannst meinen Post zum "Dank" als die Lösung markieren 😉
Hallo,
um führende Leerzeichen und alleinstehende Punkte zu erhalten (beides könnte ja beim späteren Parsen von Bedeutung sein), würde ich als Informat $char&buflen.. verwenden.
Beispiel:
data _null_;
length c $39;
input (c1-c3) ($13.); /* besser: $char13. */
c=cat(of c1-c3);
put c;
cards;
SAS wird 2016 40 Jahre alt.
;
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!