SAS删除日期之间的分隔符

SAS删除日期之间的分隔符,sas,delimiter,Sas,Delimiter,我在SAS工作,处理包含多个可能的测试和收集日期的生物测试数据。我对删除输入数据的编号系统和选择最近的测试日期感兴趣。最近的测试日期始终是可用的第一个日期,但有时缺少该日期 例如,一条记录的输入是[1]04/04/2004[2]02/10/2002[3]2/02/2002[4]01/01/2001,依此类推。在一个变量下,病例范围从1个日期到38个日期。我有兴趣删除[]中的编号系统并选择最近的测试日期。最近的测试日期始终是可用的第一个日期 我试着用 var=substr(var, x,x) 但

我在SAS工作,处理包含多个可能的测试和收集日期的生物测试数据。我对删除输入数据的编号系统和选择最近的测试日期感兴趣。最近的测试日期始终是可用的第一个日期,但有时缺少该日期

例如,一条记录的输入是
[1]04/04/2004[2]02/10/2002[3]2/02/2002[4]01/01/2001
,依此类推。在一个变量下,病例范围从1个日期到38个日期。我有兴趣删除[]中的编号系统并选择最近的测试日期。最近的测试日期始终是可用的第一个日期

我试着用

var=substr(var, x,x)
但是,当第一个日期为空时,这会带来一个问题

我希望我已经解释清楚了,如果需要澄清,请告诉我


谢谢大家!

您应该能够使用SCAN()函数提取第一个日期字符串。当您获得有效的日期字符串时停止

首先,让我们将示例转换为实际的数据集

data have;
  input var $80. ;
cards;
[1]04/04/2004[2]02/10/2002[3]2/02/2002[4]01/01/2001
[1][2][3][4][5]05/30/2021[6]04/34/2020
;
现在我们可以使用SCAN()和M修饰符来扫描字符串。您可以使用COUNTW()知道何时停止

data want;
  set have ;
  do index=3 by 2 to countw(var,'[]','m') until (date ne .);
    date=input(scan(var,index,'[]','m'),mmddyy10.);
  end;
  format date yymmdd10.;
run;
结果:

                        var                            index          date
[1]04/04/2004[2]02/10/2002[3]2/02/2002[4]01/01/2001       3     2004-04-04
[1][2][3][4][5]05/30/2021[6]04/34/2020                   11     2021-05-30

您应该能够使用SCAN()函数提取第一个日期字符串。当您获得有效的日期字符串时停止

首先,让我们将示例转换为实际的数据集

data have;
  input var $80. ;
cards;
[1]04/04/2004[2]02/10/2002[3]2/02/2002[4]01/01/2001
[1][2][3][4][5]05/30/2021[6]04/34/2020
;
现在我们可以使用SCAN()和M修饰符来扫描字符串。您可以使用COUNTW()知道何时停止

data want;
  set have ;
  do index=3 by 2 to countw(var,'[]','m') until (date ne .);
    date=input(scan(var,index,'[]','m'),mmddyy10.);
  end;
  format date yymmdd10.;
run;
结果:

                        var                            index          date
[1]04/04/2004[2]02/10/2002[3]2/02/2002[4]01/01/2001       3     2004-04-04
[1][2][3][4][5]05/30/2021[6]04/34/2020                   11     2021-05-30

可以使用正则表达式模式在字符串中定位m/d/y构造

例如:

只假设有效日期。如果遇到无效的datelike条目,则日期将丢失,数据步骤将记录
注意:函数输入的参数无效…

data have;
  input var $80. ;
cards;
[1]04/04/2004[2]02/10/2002[3]2/02/2002[4]01/01/2001
[1][2][3][4][5]05/30/2021[6]04/34/2020
[1]12/32/2021
;

data want(label='First occuring date in var' keep=var newestdate);
  set have;

  date_rxid = prxparse ('#\d{1,2}/\d{1,2}/(d{2}|\d{4})#'); /* presume m/d/y */

  start = 1;
  stop = -1;

  call prxnext(date_rxid, start, stop, var, position, length);

  if position then newestdate = input (substr(var,position,length), mmddyy10.);

  format newestdate date11.;
run;


可以使用正则表达式模式在字符串中定位m/d/y构造

例如:

只假设有效日期。如果遇到无效的datelike条目,则日期将丢失,数据步骤将记录
注意:函数输入的参数无效…

data have;
  input var $80. ;
cards;
[1]04/04/2004[2]02/10/2002[3]2/02/2002[4]01/01/2001
[1][2][3][4][5]05/30/2021[6]04/34/2020
[1]12/32/2021
;

data want(label='First occuring date in var' keep=var newestdate);
  set have;

  date_rxid = prxparse ('#\d{1,2}/\d{1,2}/(d{2}|\d{4})#'); /* presume m/d/y */

  start = 1;
  stop = -1;

  call prxnext(date_rxid, start, stop, var, position, length);

  if position then newestdate = input (substr(var,position,length), mmddyy10.);

  format newestdate date11.;
run;


那么这些值已经在字符变量中了?或者您正在从文本文件中读取值?请举例说明缺少第一个日期时该值的外观。如果是文本文件,则应备份并以不同方式重新读取。然后,您可以将每个字段都放在它自己的列中,并更轻松地使用它。@Reeza它最初是一个excel文件。我不知道如何分割列,无论我以何种方式输入文件?呈现的方式是如何从原始源中提取。谢谢你的帮助@汤姆谢谢你的帮助!所以这些值已经在一个字符中了。丢失的日期可能看起来像[1][2][3][4][5]2021年5月30日[6]2020年4月34日。最终会有一个值,但它远远低于列表,有时排在第10位或更高。你的例子很有帮助,谢谢!不过,我对第一个var=函数感到困惑。我应该在那里复制真实的数字吗?此数据集包含2000多个案例。您关心索引是什么吗?你需要知道日期是第六次吗?还是第5天?那么这些值已经在一个字符变量中了?或者您正在从文本文件中读取值?请举例说明缺少第一个日期时该值的外观。如果是文本文件,则应备份并以不同方式重新读取。然后,您可以将每个字段都放在它自己的列中,并更轻松地使用它。@Reeza它最初是一个excel文件。我不知道如何分割列,无论我以何种方式输入文件?呈现的方式是如何从原始源中提取。谢谢你的帮助@汤姆谢谢你的帮助!所以这些值已经在一个字符中了。丢失的日期可能看起来像[1][2][3][4][5]2021年5月30日[6]2020年4月34日。最终会有一个值,但它远远低于列表,有时排在第10位或更高。你的例子很有帮助,谢谢!不过,我对第一个var=函数感到困惑。我应该在那里复制真实的数字吗?此数据集包含2000多个案例。您关心索引是什么吗?你需要知道日期是第六次吗?还是第五次约会?谁不记得4月34日了?那一天可能就是我恳求第五次星球大战日。“愿4日与你同在”谁不记得4月34日了?那一天可能就是我恳求第五次星球大战日。“愿4日与你同在。”