我正在尝试将一些日志数据读入SAS Enterprise Guide。数据包含其他类型的变量中的一些URL。这种格式不是SAS的原生格式,所以这就是为什么它可能看起来有些与你有些联系。我使用datalines(在我的程序中使用infile-statment)制作了一个代码示例(原始数据包含个人信息),因此您可以了解我的恐怖情况:
DATA URL;
INFILE datalines delimiter=" " dsd EXPANDTABS TRUNCOVER;
INPUT F1 $18. REQUESTURL=$40. URL=$40. REFERER=$40.;
DATALINES;
21-07-2017 REQUESTURL="www.google.dk" URL="www.jubii.dk/user=hej" REFERER="(Iphone CPU Iphone OS)"
;
RUN;
结果是缺少变量URL,这对我的知识来说是字符串中等号的结果。 SAS将等号之前的内容读作新变量,这正是我想要避免的。我更喜欢使用命名输入(例如REQUESTURL =),因为它命名变量。但我需要获取完整的URL字符串,因为它包含大量信息(在原始数据集中)。 我尝试使用带有空格分隔符的PROC IMPORT,但是它将变量REFERER分开。
答案 0 :(得分:2)
我不明白为什么你不能使用类似于命名输入的东西以及DLM / DSD。 SAS对这类事情非常聪明。两者都允许您使用"
来捕获整个Referer字符串。但我认为你想使用下面的输入风格而不是你的风格;请注意相对较小的差异(它们周围的"
)会导致SAS将指针前进到文本字符串,然后让您混合使用DLM / DSD样式输入。
我将您的示例保存到文本文件中,并从以下代码中获取预期结果。 URL字符串中的=
不应该造成任何麻烦。
data want;
length requestURL url referer $32767;
infile "c:\temp\testurl.txt" lrecl=32767 pad dsd dlm=' ';
input
@"REQUESTURL=" requestURL $
@"URL=" url $
@"REFERER=" referer $
;
run;
答案 1 :(得分:2)
因此,在文档https://v8doc.sas.com/sashtml/lgref/z0148147.htm#z0148299中查看具有嵌入等号的值的示例时,他们提到值周围存在双重空格。所以我尝试预处理你的数据线,将双引号字符转换为双空格。
filename sample temp;
data _null_;
file sample;
infile cards expandtabs truncover ;
input line $200. ;
line = tranwrd(line,'"',' ');
len=lengthn(line);
put line $varying200. len;
cards;
21-07-2017 REQUESTURL="www.google.dk" URL="www.jubii.dk/user=hej" REFERER="(Iphone CPU Iphone OS)"
;
然后它奏效了。
DATA URL;
INFILE sample TRUNCOVER;
LENGTH F1 $18 REQUESTURL $40 URL $40 REFERER $40;
INPUT F1 REQUESTURL= URL= REFERER= ;
run;
您可能还需要折叠任何现有的双倍空格。
line = tranwrd(compbl(line),'"',' ');
答案 2 :(得分:1)
我会阅读整行,然后用SCAN()
函数解析它。
DATA URL;
INFILE datalines dsd TRUNCOVER;
format F1 $18. REQUESTURL $40. URL $40. REFERER $40.;
input;
F1 = scan(_infile_,1," ");
REQUESTURL = scan(scan(_infile_,2," ",'q'),2,"=",'q');
URL = scan(scan(_infile_,3," ",'q'),2,"=",'q');
REFERER = scan(scan(_infile_,4," ",'q'),2,"=",'q');
DATALINES;
21-07-2017 REQUESTURL="www.google.dk" URL="www.jubii.dk/user=hej" REFERER="(Iphone CPU Iphone OS)"
;
RUN;
SCAN(string,i,<delimiter>,<modifier>)
使用i
和string
从<delimiter>
获取<modifier>
个字。
'q'
修饰符告诉scan()
忽略引号内的空格。