CSV文件处理-SAS

CSV文件处理-SAS,csv,import,sas,export,Csv,Import,Sas,Export,我对SAS编程非常陌生,并试图找到最有效的方法来实现我目前正在进行的计划。基本上,我需要修改存储在SAS服务器上的现有.csv文件,并将其保存在同一服务器上的我的文件夹中 所需修改: 将.csv保留为格式 使用“|”而不是“,”作为分隔符 具有以下输出名称:filename_YYYYMMDDhhmmss.csv 仅保留原始文件中的4个变量 重命名我们保留的一些变量 以下是我当前使用的脚本,但它存在一些问题: PROC IMPORT OUT = libname.original_file (

我对SAS编程非常陌生,并试图找到最有效的方法来实现我目前正在进行的计划。基本上,我需要修改存储在SAS服务器上的现有.csv文件,并将其保存在同一服务器上的我的文件夹中

所需修改:

  • 将.csv保留为格式
  • 使用“|”而不是“,”作为分隔符
  • 具有以下输出名称:filename_YYYYMMDDhhmmss.csv
  • 仅保留原始文件中的4个变量
  • 重命名我们保留的一些变量
以下是我当前使用的脚本,但它存在一些问题:

 PROC IMPORT OUT = libname.original_file (drop=var0)
              FILE = "/.../file_on_server.csv"
              DBMS = CSV
              REPLACE;
 RUN;


%PUT date_human = %SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TODAY())-1), datetime20.));

proc export data = libname.original_file ( rename= ( var1=VAR11 var2=VAR22 Type=VAR33 )) 
        outfile = '/.../filename_&date_human..csv' label dbms=csv replace;
        delimiter='|';
run;
在重命名名为“Type”的变量时,我也遇到了一个问题,因为它看起来与一些系统关键字有冲突。日期格式也不好,不幸的是,我无法在SAS论坛上找到确切的格式


非常感谢关于如何使此脚本更高效的任何建议。

我不会费心将数据读入SAS数据集中。只需处理它并将其写出来。如果输入结构是一致的,那么它就相当简单。只需将所有内容读取为字符串,并输出要保留的列

让我们假设数据有12列,要保留的四列中的最后一列是第10列。所以你只需要读10本

首先在宏变量中设置输入和输出文件名,以便于编辑。可以使用逻辑为新文件生成文件名

%let infile=/.../file_on_server.csv;
%let outfile=/.../filename_&date_human..csv;
然后使用一个简单的DATA NULL u步骤将数据读取为字符串并将其写回。如果需要,您甚至可以更改四列的相对顺序。因此,该程序将复制第2、5、4和10列,并将列标题更改为NewName1、NewName2、NewName3和NewName4

data _null_;
  infile "&infile" dsd dlm=',' truncover;
  file "&outfile" dsd dlm='|';
  length var1-var10 $200 ;
  input var1-var10;
  if _n_=1 then do;
     var2='NewName1';
     var5='NewName2';
     var4='NewName3';
     var10='NewName4';
  end;
  put var2 var5 var4 var10 ;
run;
如果要保留的四列的某些数据超过200个字符,则只需更新LENGTH语句

让我们做个小实验。首先,让我们创建一个虚拟CSV文件

filename example temp;
data _null_;
  file example ;
  input;
  put _infile_;
cards4;
a,b,c,d,e,f,g,h,i,j,k,l,m
1,2,3,4,5,6,7,8,9,10,11,12,13
o,p,q,r,s,t,u,v,w,x,y,z
;;;;
现在让我们试着运行它。我将修改infle和FILE语句,从临时文件中读取并将结果写入日志

  infile example /* "&infile" */ dsd dlm=',' truncover;
  file log /* "&outfile" */ dsd dlm='|';
下面是写入的结果行

NewName1|NewName2|NewName3|NewName4
2|5|4|10
p|s|r|x

非常感谢您如此详细的解释!为什么我可以得到必要的新变量名,但内容都是空的?确保PUT位于IF块之后。还要确保数据行实际上是逗号分隔的。由于IF块强制第一条记录的值,因此第一行也可能被读取为空。添加此语句以转储前5行<代码>如果我试图修复脚本,但仍然没有得到任何结果,但值由指定的“|”分隔。我喜欢使用
LIST
语句查看源文本文件<代码>数据\u空\u;填充“&infle”obs=5;列表运行也许您的源文件不是csv文件?或者你的文件名错了?如果它真的是一个大型机,可能是在EBCDIC中?输入是csv,路径是正确的,就像我在proc导入/导出中使用相同的宏变量一样,它们工作。我希望在没有中间数据集的单个脚本中运行这项工作,但在这里调试仍然没有成功。