LesezeichenAbonnierenRSS-Feed abonnieren
HendrikE
Calcite | Level 5

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

 

5 ANTWORTEN 5
Kurt_Bremser
Super User

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;
HendrikE
Calcite | Level 5

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);
HendrikE
Calcite | Level 5
Hallo Kurt,
das würde ich sehr gerne machen. Aber wie bzw. wo mache ich das? Ich habe unter deinem Post als Buttons nur: Kudos, Antworten, Schnelle Antwort. Im Popup-Menü (Rädchen) neben deinem Post sehe ich auch keinen Menüpunkt...
FreelanceReinh
Jade | Level 19

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.
;