Date Can';将csv导入SAS时,请不要正确设置日期格式

Date Can';将csv导入SAS时,请不要正确设置日期格式,date,sas,Date,Sas,我正在将一个csv文件导入SAS,其中包含一个使用类似于worddatxw的word日期格式的字段。但对于日期后的字母(例如,1而不是1): 我已经做到了这一点: data work.leafletdata; infile "C:\rawdata.csv" delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2; informat Week_of_the_promotion *weird informat?

我正在将一个csv文件导入SAS,其中包含一个使用类似于worddatxw的word日期格式的字段。但对于日期后的字母(例如,1而不是1):

我已经做到了这一点:

data work.leafletdata;
    infile "C:\rawdata.csv" 
    delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2;
    informat
        Week_of_the_promotion *weird informat?* Barcode $20. 
                StartDate mmddyy10.   EndDate mmddyy10. ;
    format
        Week_of_the_promotion *preferably date9.* Barcode $20. 
        StartDate date9.      EndDate   date9.  ;
    input 
        Week_of_the_promotion $  Barcode $  
                StartDate $              EndDate $  ;
run;
我无法确定如何使用proc import将其导入SAS,同时在SAS内将其转换为可用日期


我是SAS初学者,所以请使用外行术语。谢谢!:)

这是一种可能的解决方案-将其分解为“2013年4月1日”,然后从“2013年4月”开始构建一个日期,最后使用“1日”和
intnx
函数提前该周数。根据您对“4月1日”的定义,您可能需要调整呼叫至
intnx
(例如,在3月31日开始的示例中,如果您的公司将该周定义为4月7日至4月13日这一周,则这是不同的,如果您需要从一周中的不同日期开始,则这也是一种调整-查看以了解更多信息).

  • Scan
    通过分隔符(默认为空格)将字符串分隔为单词,并返回您要求的单词(此处为1)<代码>压缩删除/保留特定类型的字符;这里我用它来“保留”数字。所以
    scan
    返回“1st”,然后我告诉它只保留数字,所以是“1”
  • 这里我们使用
    scan
    两次,得到“April”和“2013”。使用substr将April剪切为前3个字符“Apr”,因为SAS日期最容易读取。然后,我们将年份附加到末尾,并将“01”附加到开头(对于…中的第一天)。结果是“01APR2013”,然后使用日期信息将其输入到数字中(DDMONYYYY是SAS的默认日期,格式为/格式)
  • 我们在这里使用
    intnx
    ,它将日期提前一定数量的日期间隔。我们使用“week”将其提前一定的周数,并将存储在“weeknum”(来自注释1)中的数字提前1(因为第1周=提前0周,第2周=提前1周,等等),“b”是一周的“开始”(与“end”或“middle”或“same”相反)。“周”是从周日开始的默认周;第二周将把前两天改为从周二开始的几周,以此类推

  • 有多少不同的日期?哦,这很有用,谢谢!我发现了一个类似于你的方法,它似乎可以一次性转换:新的促销周=输入(压缩(压缩(扫描(促销周,1,,,,'a'))| | substr(扫描(促销周,2,,),1,3)| |扫描(促销周,3,,),日期9.);但是我想在proc导入期间实现这一点。这是可能的还是必须在单独的数据步骤中进行?谢谢你当然可以把所有这些东西组合在一起,我故意把它们分开,这样你就可以看到这些部分组合在一起了(而且几乎没有额外的开销——只需去掉额外的变量,就不重要了);您无法在
    proc import
    中执行此操作。但是,您可以在输入数据步骤(如上面所述)中执行此操作,这是一个正常的数据步骤。第二,我不认为这真的能正常工作——只是用“周”作为一天,这与一周不同。为了满足我的好奇心,是否有办法删除所有“st”、“rd”、“nd”和“th”的实例,以便sas将日期识别为单词datxw。格式化?可以使用TRANWRD或prx(正则表达式)来实现。或者您可以通过执行与上述类似的过程来删除它;扫描第一个单词,压缩出字母,然后用substr(weekvar,4)替换剩余的单词,并将压缩出的第一个单词连接到该子字符串。
    data work.leafletdata;
        infile "C:\rawdata.csv" 
        delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2;
        informat
            Week_of_the_promotion *weird informat?* Barcode $20. 
                    StartDate mmddyy10.   EndDate mmddyy10. ;
        format
            Week_of_the_promotion *preferably date9.* Barcode $20. 
            StartDate date9.      EndDate   date9.  ;
        input 
            Week_of_the_promotion $  Barcode $  
                    StartDate $              EndDate $  ;
    run;
    
    data have;
    infile datalines truncover;
    input @1 week_of_the_promotion $25.;
    datalines;
    1st April 2013 
    1st April 2013 
    3rd April 2013 
    3rd April 2013 
    5th April 2013
    ;;;;
    run;
    
    data want;
    set have;
    weeknum = compress(scan(week_of_the_promotion,1),,'kd');  *Note 1;
    for_date = '01'||substr(scan(week_of_the_promotion,2),1,3)||
      scan(week_of_the_promotion,3);  *Note 2;
    actual_date = intnx('week',input(for_date,date9.),weeknum-1,'b'); *Note 3;
    format actual_date date9.;
    put week_of_the_promotion= actual_date=;
    run;