【问题标题】:SAS proc import .csv files missing column issueSAS proc 导入 .csv 文件缺少列问题
【发布时间】:2015-12-05 23:08:00
【问题描述】:

我正在尝试将多个 .csv 文件导入 SAS。这些 csv 文件是 12 个月的每小时温度数据,每列代表日期和时间。例如,一月文件的列是:20120101 00-20120131 23。由于月份的长度不同,因此列号也不同。

使用以下代码导入数据,

 proc import out=air.air&year
 datafile="year\hourly*.csv" dbms=csv replace;
 getnames=yes;
 DATAROW=2; 
 run;

我只有到第 29 天的日期时间。我猜阅读顺序很重要,所以我尝试重新排序文件名以使 1 月成为第一个文件,但仍然未能读取所有列。

鉴于所涉及的大约 20 年每月每小时的数据,要一一指定文件名并不容易。有谁知道 SAS 按什么顺序读取一个文件夹中的文件?

如果有人能指出一个处理类似任务的方向,我真的很感激。

谢谢!

【问题讨论】:

    标签: csv import sas


    【解决方案1】:

    如果您知道结构,则无需使用 PROC IMPORT 来读取 CSV 文件。只需使用 DATA STEP 直接读取它们。例如,如果所有值都是数字并且每个文件的顶部有一个需要跳过的标题行,这应该可以工作。您应该能够从 FILENAME 中解析出年份和月份。如果这些列确实是从第 1 天的 0 小时到该月最后一天的 23 小时,那么只需使用 DO 循环来增加 DAY 和 HOUR 变量。

    data AIR ;
      length filename filevar $200 ;     
      infile "&path\hourly*.csv" dsd truncover length=ll column=cc filename=filevar;
      input @;
      filename=filevar;
      if filename ne lag(filename) then do;
         input / @ ;
         row=0;
      end;
      row+1;
      do day=1 to 31 while (cc < ll) ;
        do hour=0 to 23 while (cc < ll) ;
          input value @ ;
          output;
        end;
      end;
    run;
    

    【讨论】:

    • 也许添加一个列计数器,然后使用intnx('Hour',...) 将其转换为通常是变量名的小时/天值?
    • 代码使用 COL 作为列计数器。真正的问题是标题行是否包含可能需要读取并与值组合的实际信息。
    • 好吧,标题行包含小时/天信息,但您可以使用 intnx 从 col 获取信息(很好,它已经在那里,完全隔开)。跨度>
    • 我试过汤姆的代码确实有效,但我的问题要复杂得多,所以我会探索更多。谢谢大家的启发!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多