File io infle dlm='@@';,但电子邮件地址被截断了

File io infle dlm='@@';,但电子邮件地址被截断了,file-io,sas,option,dlm,File Io,Sas,Option,Dlm,我正在尝试使用: infile dlm='@@' dsd missover; 将SAS代码复制到新位置,但它截断了电子邮件地址(有一个电子邮件地址,例如。abc@xyz.com在SAS代码中),新代码中只显示用户名“ABC”,并且“@xyz.com”部分被截断 所以我排除了内嵌选项 dlm='@@' 重新运行代码,正确读取电子邮件地址,但缺少一些常规行 只是想知道如果一些填充选项,我可以尝试阅读所有的行正确,也阅读电子邮件地址正确 谢谢 例如: *91,87,95 abc@xyz.com

我正在尝试使用:

infile dlm='@@' dsd missover; 
将SAS代码复制到新位置,但它截断了电子邮件地址(有一个电子邮件地址,例如。abc@xyz.com在SAS代码中),新代码中只显示用户名“ABC”,并且“@xyz.com”部分被截断

所以我排除了内嵌选项

dlm='@@' 
重新运行代码,正确读取电子邮件地址,但缺少一些常规行

只是想知道如果一些填充选项,我可以尝试阅读所有的行正确,也阅读电子邮件地址正确

谢谢

例如:

*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;

看起来您的数据正在使用空格作为分隔符

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

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 ;
;;;;
现在我们可以读取文件并将其解析为单个“单词”

结果:

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选项添加到infle语句中,您将获得更多单词,因为相邻(或前导)空格将指示空单词。

使用

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

如果您真的不需要分隔符。

您可以显示您试图读取的示例数据行和您正在使用的实际输入语句吗。请注意,设置DLM='@@'与设置DLM='@'相同,因为DLM选项的值是单个字符的列表,每个字符都将被视为分隔符。所以,重复其中一个字符多次没有任何作用。只是给了一封电子邮件,请检查一下,非常感谢!不能像读取纯文本文件一样读取二进制XLSX文件。包含分隔符的值需要用引号括起来。因此,如果您有如下数据:
field1@filed2@joe@host.com@filed4
您需要生成带有如下引号的文本文件:
field1@filed2@"joe@host.com“@filed4
。您的示例似乎使用空格作为分隔符。您在答案make下的注释听起来似乎根本不想将行拆分为单词。所以不要。只需使用格式化输入。如果要保留行中的前导空格,请使用
$CHAR
informat<代码>填充'xxx.txt'truncover;输入行$char5000谢谢Tom,这很好,但是,如果存在多个空格,这将截断空格。e、 g.abcde flag='TU';在输出中将为abcde flag='TU';另外,如果第一行和第二行之间有一个空行,我希望保留该空行。不管怎样,我只想保持新文件和旧文件一样。再次感谢!如果你想保持原样,为什么要把它分成几块?你是说你想把每一行读成一个长字符串值吗?把<代码> trun覆盖< /Cord>选项添加到<代码> iFILE < /Cord>语句中,以阻止它跳过空白行。如果要跟踪多个空格彼此相邻的位置,请添加DSD选项。该选项有效,但如果引号内的空格(例如x='abc de fg',则只会删除一些空格,只剩下1个空格)。不知道我们能否解决这个问题,谢谢!如果您使用的是DSD选项,并且您有一些看起来像带引号的字符串,那么它将删除引号,而不是空格。您可以尝试在输入语句中的变量名后添加
~
修改器,以防止其删除引号。
infile 'email.xlsx' dlm='00'x;