infile dlm='@@',但电子邮件地址被截断

infile dlm='@@', but truncated email address

我正在尝试使用:

infile dlm='@@' dsd missover; 

将 SAS 代码复制到新位置,但它包含电子邮件地址(SAS 代码中有一个电子邮件地址,例如 abc@xyz.com),并且只有用户名'ABC' 出现在新代码中,'@xyz.com' 部分被 t运行 处理。

所以我排除了 infile 选项

dlm='@@' 

重新运行代码和电子邮件地址已正确读取,但缺少一些常规行。

只是想知道一些 infile 选项是否可以尝试正确读取所有行,也可以正确读取电子邮件地址。

谢谢!

一个例子:

*91,87,95 abc@xyz.com test hudpiwaHUOV0 
 97,,92% bmno[aej0i34hmbtgkoersw934bnrtui9sdobn vnbud9rw0aq598vnfjipa 
 njuio9rpep0snhtui9es000 
 from="mjerrt_thpian@wedoo.com" 
 fjsui123,1,1 0 ;

 data a;
 infile "/.../email.xlsx" 
   missover dsd lrecl=32767 firstobs=1;* dlm='@';     * delimiter = '@@';
   informat all $char50. ;
  input all $ ;
  pk=_n_;
 run;

您的数据似乎使用 space 作为分隔符。

让我们将您的示例文本转换成一个文件,以便我们进行测试。

filename txt temp;
options parmcards=txt;
parmcards4;
*91,87,95 abc@xyz.com test hudpiwaHUOV0 
 97,,92% bmno[aej0i34hmbtgkoersw934bnrtui9sdobn vnbud9rw0aq598vnfjipa 
 njuio9rpep0snhtui9es000 
 from="mjerrt_thpian@wedoo.com" 
 fjsui123,1,1 0 ;
;;;;

现在我们可以读取文件并将其解析为单独的"words"。

data parse ;
  infile txt dlm=' ' length=llen column=ccol ;
  lineno+1;
  do wordno=1 by 1 until(ccol>llen);
    length word 0 ;
    input word @ ;
    output;
  end;
run;

结果:

Obs    lineno    wordno    word

  1       1         1      *91,87,95
  2       1         2      abc@xyz.com
  3       1         3      test
  4       1         4      hudpiwaHUOV0
  5       2         1      97,,92%
  6       2         2      bmno[aej0i34hmbtgkoersw934bnrtui9sdobn
  7       2         3      vnbud9rw0aq598vnfjipa
  8       3         1      njuio9rpep0snhtui9es000
  9       4         1      from="mjerrt_thpian@wedoo.com"
 10       5         1      fjsui123,1,1
 11       5         2      0
 12       5         3      ;

如果将 DSD 选项添加到 INFILE 语句中,您将获得更多单词,因为相邻(或前导)spaces 将指示一个空单词。

使用

infile 'email.xlsx' dlm='00'x;

如果你真的不需要定界符。