proc report und intelligentes Verfahren mit der Split-Option

hallo,

folgendes problem:

ich will string-values in proc report mit split='~' und FLOW darstellen, und zwar soll jeder string so umgebrochen werden, dass nur ganze wörter umgebrochen werden. es dürfen höchstens 10 zeichen pro zeile stehenbleiben.

anstatt also von hand tausende von records zu durchsuchen und überall den split-character manuell einzugeben, soll mir eine vor-verarbeitung das ermöglichen. in javascript habe ich bereits eine fertige lösung, die ich hier präsentieren will. Wer kann mir helfen, daraus SAS code zu generieren?

der folgende code kann getestet werden, wenn man ihn abspeichert als z.b. test.htm und im browser öffnet. zuvor müssen noch die blanks innerhalb der spitzen klammern entfernt werden in den tags "html" und "script".

hier der code:



split_fix_length


wie euch auffällt, hat sas nicht die funktion lastIndexOf(), die hier die arbeit erleichtert. ausserdem kann man in sas nicht so elegant aus der loop ausbrechen wie hier mit break. dennoch, eine lösung sollte es geben in sas.

so könnte es gehen

data tilde;
length alt construct neu $200;
keep alt neu;
alt ="hallo du da draussen wo gehst du hin";
construct='';
neu='';
do i=1 to length(alt)-length(compress(alt))+1;
if construct eq '' then
construct=scan(alt,i,' ');
else
if length(construct) + length(scan(alt,i,' '))+1 le 10 then
construct=trim(construct)||' '||scan(alt,i,' ');
else do;
if neu eq '' then
neu=construct;
else
neu=trim(neu)||'~'||construct;
construct=scan(alt,i,' ');
end;
end;
if neu eq '' then
neu=construct;
else
neu=trim(neu)||'~'||construct;
run;

Allerdings gibt es natürlich auch Wörter mit mehr als 10 Zeichen.

Gruß Guido

noch vergessen zu sagen, was

noch vergessen zu sagen, was rauskommt:

hallo du~da~draussen~wo gehst~du hin

die tilden werden also von proc report dann benutzt!!!

insert char.

hallo Guido,

danke für den code. ist ne sehr effiziente lösung, wie ich finde. Ich hätte das wohl mit der reverse() lange versucht, aber so ist es ja viel eleganter.

viele grüsse
Dirk