Keep reading input from next row in the same variable

Refresh

December 2018

Views

94 time

2

I have data from a chat that i want to read in one entry at the time. Every time a person has hit "send" should be one observation. The problem is when there is breaks (enter) in the text. I can't manage to make SAS keep reading this as the same observation. Here is some dummy data:

   08:23 - Greg: Hi!
   08:24 - Sue: Hello
   08:24 - Greg: How are you?
   08:25 - Sue: Just fine :)

   How are you then?
   08:26 - Greg: All good. 

I want this to be 5 observations but i can only manage SAS to read this as 7 obs. Desired dataset should look like:

Obs   VAR1
1    08:23 - Greg: Hi!
2    08:24 - Sue: Hello
3    08:24 - Greg: How are you?
4    08:25 - Sue: Just fine :) How are you then?
5    08:26 - Greg: All good. 

I play around with the code:

data testing;
infile datalines ;
input var1 $60. ;
datalines;
08:23 - Greg: Hi!
08:24 - Sue: Hello
08:24 - Greg: How are you?
08:25 - Sue: Just fine :)

How are you then?
08:26 - Greg: All good. 
;

But the actual file is a txt and have more irregularities than the above dummy example. I have tried to use the trailing @ but cant get it to work the way i want. Maybe trailing @ is not what i am after. Any suggestions how to proceed?

4 answers

1

Попробуй это.

Пополняемый переменную, которая является последним значением. Если текущее значение имеет временную метку в течение первых 4-х символов, а затем выводит его и сбросить значение «». Append текущего значения бегущего переменный. Наконец, выход последней строки, независимо от того, что.

data testing(keep=line);
set testing end=last;

format line $2000.;
retain line;

if _n_ > 1 then do;
    if index(substr(var1,1,4),":") then do;
        output;
        line = "";
    end;
end;

put line= var1=;
line = catx(" ",line , var1);
put line=;

if last then do;
    output;
    put "AT LAST";
end;
run;
0

Есть много способов сделать это, в зависимости от конкретного случая использования.

Вот регулярное выражение один. Это не будет работать, если у вас есть> 32767 общие символы, если у вас есть какой-нибудь способ, чтобы разделить его на куски, но для небольших файлов работает хорошо; и общий подход может быть использован, даже если вы читаете в строке за раз.

data test;
infile "c:\temp\chat.txt" recfm=f lrecl=32767;
input @;
rx_find = prxparse('~(\d\d:\d\d -.*?)(?=(?:\b\d\d:\d\d)|$)~ios');
rc_find = prxmatch(rx_find,_infile_);
pos=1;
pos2=0;
start=1;
call prxposn(rx_find,1,pos,len);
do until (pos2=0);
    call prxposn(rx_find,1,pos,len);
    found=substr(_infile_,pos,len);
    output;
    start=pos+len;
    call prxnext(rx_find,start,-1,_infile_,pos2,len2);
end;
stop;
run;
Joe
0
filename FT15F001 temp;  
data testing ;
infile FT15F001 end=eof ;
length string $6323;
retain string;
input @;
if _n_=1 then string=_infile_;
else if not missing(_infile_) and anydigit(_infile_)^=1 then string=catx(' ',string,_infile_);
else if not missing(_infile_) and anydigit(_infile_)=1 then do;
   output;
   call missing(string);
   string=_infile_;
end;
if eof then output;
PARMCARDS;
08:23 - Greg: Hi!
08:24 - Sue: Hello
08:24 - Greg: How are you?
08:25 - Sue: Just fine :)

How are you then?
08:26 - Greg: All good. 
;
0

Я безуспешно пытался найти решение при вводе данных строк, во всяком случае, я надеюсь, что это будет полезно для вас, постобработки строк:

data testing;
infile datalines ;
input var1 $60.;
datalines;
08:23 - Greg: Hi!
08:24 - Sue: Hello
08:24 - Greg: How are you?
08:25 - Sue: Just fine :)

How are you then?
08:26 - Greg: All good. 
;

data testing01;
set testing;
retain row 0;
if input(substr(var1,1,2),8.) le 24 and input(substr(var1,1,2),8.) ne .
and substr(var1,3,1)=':' 
and input(substr(var1,4,2),8.) le 59 and input(substr(var1,4,2),8.) ne . then row = row+1; else row=row;
run;

proc transpose data=testing01 out=testing02;
var var1;
by row;
run;

data testing03;
length final $2000;
set testing02;
array str[*] col:;
do i=1 to dim(str);
if str[i] ne '' then final=cats(strip(final)||' '||strip(str[i]));
end; 
drop col: row i _name_;
run;