命名输入和网址

时间:2018-01-30 14:46:03

标签: sas

我正在尝试将一些日志数据读入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分开。

3 个答案:

答案 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;

enter image description here

您可能还需要折叠任何现有的双倍空格。

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>)使用istring<delimiter>获取<modifier>个字。

'q'修饰符告诉scan()忽略引号内的空格。