【问题标题】:Get names and record counts for .txt files in a folder获取文件夹中 .txt 文件的名称和记录数
【发布时间】:2014-07-02 17:01:07
【问题描述】:

我已将 SAS 数据集导出为 .txt 文件。如何获取所有这些文本文件的名称和记录数?这是为了创建一个表/报告,显示哪些 SAS 数据集被导出到文本文件以及每个文本文件有多少条记录。如果这些文件是 SAS 数据集,我知道如何做类似的事情,但我在 .txt 文件上找不到任何东西。

SAS 中的导出过程生成导出结果和每个文件中的记录数。但我正在为 40-50 个国家/地区的多个文件进行导出。因此,我无法查看导出日志的每一行来确定多个文件的名称和记录计数。并且在这里打开每个文件以获取记录计数不是一个选项:)

我需要一份报告,最好是表格格式,列出导出的文本文件的名称和每个文件的记录数。

感谢 Chris,您的建议和代码。但是没有主数据集。让我再解释一下我的问题:

Country A has 10 different SAS datasets - Adata01.sas7bdat....Adata10.sas7bdat
Country B has 15 different SAS datasets - Bdata02.sas7bdat...Bdata15.sas7bdat
...and so on.

我需要将这些数据集中的每一个都导出到一个使用 UTF8 编码的文本文件中——我已经这样做了。所以,现在我有:

Country A - Adata01.txt, Adata02.txt....Adata10.txt
Country B - Bdata02.txt, Bdata03.txt...Bdata15.txt

我能想到的一个选项是 - 扫描导出日志并提取文本文件的名称和写入文本文件的记录数。我想要的是这样的:

Sas Data          Exported   Text Data     # of Records
Adata01.sas7bdat  Yes        Adata01.txt   8000

有什么好的方法吗?

【问题讨论】:

    标签: export sas text-files


    【解决方案1】:

    如果您愿意接受 SAS 关于它输出多少记录的说法(即相信日志),您可以解析日志。下面是一个例子;它可能适用于您的具体情况,也可能不适用,但它应该是一个有用的指南。

    proc printto log="d:\temp\log.txt" new; *put log out to a file somewhere;
    run;
     *here is your proc export;
    proc export data=sashelp.class outfile="d:\temp\test.txt" dbms=tab replace;
    run;
    proc printto;
    run;
    
    data log_parse;
    infile "d:\temp\log.txt"; *your log file;
    input @;                  *open for input;
    if find(_infile_,'were written') then do;  *if we are on the right line;
        input
            @"NOTE: " records                 /*@"str" is a useful kind of input here */
            @"the file " filename :$50.       /*"the file " is in case you have 'file' in your filename.  You may want to parse this further (for example, remove quotes)*/
            ;
        output;
    end;
    run;
    

    【讨论】:

    • 请注意,这假设您需要实际写出的行数; EFIREC 自动宏变量中提供了记录数(在 SAS 中)。如果您在每次导出后保存它,您可以将其用作比较。
    • 这可能行得通 - 让我做一些更改并回复您。谢谢乔!
    【解决方案2】:

    我不熟悉 SAS 数据集,但是,这里有一些想法,假设您无法从 SAS 中获取导出详细信息。但希望该信息是可用的,并且有人会告诉您如何获取它。

    如果不是这里是一个非常简单的解决方案: 如果导出的每个项目包含 1 行数据,只需打开文件并计算行数。 要获取导出数据集的数量,请使用临时文件夹进行导出,然后获取文件夹中文件的计数。数数时,将它们移到人们期望它们的文件夹中(这样就不会数两次)。

    有了这个,你有每个导出文件的名称,每个文件的行数(即导出的项目数),位置(因为你把它移出临时,你知道你把它移到哪里了),以及如何许多在此过程中被导出。

    我在这里做了一些简单的假设。假设以上都不合适,多贴一点细节,你会得到更多建议。

    【讨论】:

      【解决方案3】:

      为什么不从创建文本文件的 SAS 数据集中获取 # 条记录?

      假设您将每个国家/地区的所有记录导出到每个国家/地区的文本文件中,您只需在主数据集上按国家/地区执行 proc freq。这将给出每个国家/地区输出文件中的 # 条记录。

      /* 按国家/地区生成计数 */ proc freq data=master noprint ; 表国家 /out=f_countries ; 跑 ; 数据_null_; 设置 f_countries end=eof ; 调用 symputx(cats('CTRY',_n_),COUNTRY) ; 如果 eof 则调用 symputx('CTRYN',_n_) ; 跑 ; %MACRO EXPORT_LOOP ; %DO I = 1 %TO &CTRYN ; proc export data=master (where=(COUNTRY="&&CTRY&I")) outfile="c:\Country &&CTRY&I...txt" dbms=tab ; 跑 ; %结尾 ; %修复; %EXPORT_LOOP ; title "按国家记录计数,输出文件 = c:\Country .txt" ; proc 报告数据=f_countries ; 跑 ;

      【讨论】:

      • 导出或转换可能导致截断或其他不一致,因为我正在对文本文件进行 UTF-8 编码。这就是我需要从文本文件中获取记录数的原因。
      • SAS 日志将指示写入文本文件的记录数,这与 SAS 数据集的#输入记录相同。我认为这不会反映任何编码“不一致”。完成您要求的唯一方法是将文本文件读回 SAS。
      • @rom 您是否愿意相信 SAS 会输出它所说的行(即,如果您可以阅读日志,您会相信其中的信息)?
      • @Joe,如果我可以从导出日志中提取文本文件的名称和记录数,这将起作用。您对此有何建议?
      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 2012-10-24
      • 2018-04-02
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      相关资源
      最近更新 更多