Community deutschsprachiger SAS-Anwender und -Programmierer

Antworten
Dies ist eine offene Gruppe. Melden Sie sich an und klicken Sie auf die Schaltfläche „Gruppe beitreten“, um Mitglied zu werden und damit zu beginnen, Beiträge in dieser Gruppe zu veröffentlichen.
Highlighted
Occasional Contributor
Beiträge: 6
Einlesen von mehr als 32767 Zeichen

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

 

Super User
Beiträge: 6.939
Betreff: Einlesen von mehr als 32767 Zeichen

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;
---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Occasional Contributor
Beiträge: 6
Betreff: Einlesen von mehr als 32767 Zeichen

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);
Super User
Beiträge: 6.939
Betreff: Einlesen von mehr als 32767 Zeichen
[ Bearbeitet ]

Aber bitte Smiley (fröhlich)

Du kannst meinen Post zum "Dank" als die Lösung markieren Smiley (zwinkernd)

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Occasional Contributor
Beiträge: 6
Betreff: Einlesen von mehr als 32767 Zeichen
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...
Trusted Advisor
Beiträge: 1.115
Betreff: Einlesen von mehr als 32767 Zeichen

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