专栏首页SAS程序分享号号号Macro-csv2sas(可控制变量Length)

Macro-csv2sas(可控制变量Length)

Welcome to Macro panel

说明

目的: 将CSV数据导入到SAS中

参数说明:

Path 路径

csvname 文件名(支持csv,txt格式)

outds 输出数据集名称

colmax 预估csv列数

encoding csv文件编码格式(支持UTF-8与GB2312)

Varr 变量所在的行:如不需要则填0

labelr label所在的行:默认1


%macro csv_csv2sas(path=,csvname=,colmax=%str(10000),outds=,encoding=gb2312,varr=0,labelr=1,length=500);

/*options mprint macrogen;*/

options nomprint nomacrogen;

options nonotes ;

%if "%upcase(%scan(&csvname.,-1,'.'))"^="CSV" AND "%upcase(%scan(&csvname.,-1,'.'))"^="TXT" %then %do;

%put NOTE:Please enter the correct file type.This Macro support .CSV /.txt;

%goto exit;

%end;

options notes;

%if %length(&encoding.)=0 %then %do;

%let _encoding=gb2312;

%end;

%else %if "%upcase(&encoding.)"="GB" or "%upcase(&encoding.)"="GB2312" %then %do;

%let _encoding=GB2312;

%end;

%else %if "%upcase(&encoding.)"="EN" or "%upcase(&encoding.)"="UTF" or "%upcase(&encoding.)"="UTF-8" %then %do;

%let _encoding=utf-8;

%end;

filename csvfn "&path.\&csvname." encoding="&_encoding.";

%if "%upcase(%scan(&csvname.,-1,'.'))"="CSV" %then %do;

data &outds. ;

%let _EFIERR_ = 0;

infile csvfn delimiter = ',' MISSOVER DSD lrecl=1000000 firstobs=1 obs=3 ;

informat %do i=1 %to &colmax.; %sysfunc(compress(Var&i.)) $800. %end;;

format %do i=1 %to &colmax.; %sysfunc(compress(Var&i.)) $800. %end;;

input %do i=1 %to &colmax.; %sysfunc(compress(Var&i.)) $ %end;;

if _ERROR_ then call symput('_EFIERR_',1);

run;

%end;

%if "%upcase(%scan(&csvname.,-1,'.'))"="TXT" %then %do;

proc import datafile = csvfn out = &outds dbms = tab replace;

delimiter = ',';

getnames = no;

run;

%end;

options notes ;

/*find the CSV Max Col for next data file*/

data csv_tem1;

set &outds.;

if _N_<3;

proc transpose data=csv_tem1 out=csv_tem2 prefix=TYP;

by notsorted ;

var _all_;

run;

proc sql noprint;

select Max(input(compress(_NAME_,'','kd'),best.)) into: uloop

from csv_tem2 where ^missing(TYP1);

quit;

%put NOTE:This CSV have COL:&uloop.;

/*Set Length And Format */

data csv_tem2;

set csv_tem2;

if input(compress(_NAME_,'','kd'),best.) >&uloop. then delete;

_format=catx(' ',_NAME_,"$&length..");

_input=catx(' ',_NAME_,"$");

%if &labelr.=1 or &labelr.=2 %then %do;

TYP&labelr.=compress(TYP&labelr.,'','s');

len=length(TYP&labelr.);

if mod(count(TYP&labelr.,"'"),2)=0 then

TYP&labelr.=tranwrd(strip(TYP&labelr.),"'","''");

else TYP&labelr.=tranwrd(strip(TYP&labelr.),"'","'''");

_label=catx("=",_NAME_,compress(strip("'")||Strip(TYP&labelr.)||strip("'")));

%end;

%if &varr.=1 or &varr.=2 %then %do;

TYP&varr.=compress(tranwrd(strip(TYP&varr.),' ','_'));

_rename=catx("=",_NAME_,compress(TYP&varr.));

%end;

run;

/*%goto exit;*/

data _null_;

set csv_tem2;

%if &labelr.=1 or &labelr.=2 %then %do;

call symput('_label'||compress(put(_n_,best.)),strip(_label)); %end;

%if &varr.=1 or &varr.=2 %then %do;

call symput('_rename'||compress(put(_n_,best.)),strip(_rename)); %end;

call symput('_format'||compress(put(_n_,best.)),strip(_format));

call symput('_input'||compress(put(_n_,best.)),strip(_input));

run;

%let _lrc=%eval(&length.*&uloop.);

%put NOTE:&_lrc.;

data &outds. ;

%let _EFIERR_ = 0;

infile csvfn delimiter = ',' MISSOVER DSD lrecl=&_lrc. firstobs=1 ;

informat %do i=1 %to &uloop.;%sysfunc(compress(&&_format&i.)) %end;;;

format %do i=1 %to &uloop.;%sysfunc(compress(&&_format&i.)) %end;;;

input %do i=1 %to &uloop.;%sysfunc(compress(&&_input&i.)) %end;;;

%if &varr.=1 or &varr.=2 %then %do;

rename %do i=1 %to &uloop.;%sysfunc(compress(&&_rename&i.)) %end;;;

%end;

%if &labelr.=1 or &labelr.=2 %then %do;

label %do i=1 %to &uloop.;%sysfunc(compress(&&_label&i.)) %end;;;

%end;

if _ERROR_ then call symput('_EFIERR_',1);

run;

proc delete data=csv_tem1 csv_tem2 ;quit;

options notes;

;

%exit:

%mend;


可到百度网盘下载:Macro Code 网盘:https://pan.baidu.com/s/1pLMHdub

本文分享自微信公众号 - SAS程序分享号号号(xiaocgn),作者:Setup~

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SAS-时药曲线的绘制(完)

    本文是上一篇的推文的续篇,本篇推文将主要介绍GTL绘制受试者维度的时药曲线(画拼图),并分享小编刚出炉的,还热腾腾的自动画图的宏程序。点击

    Setup
  • SAS-一个小程序实现自动插入空白行~

    前几天一个朋友问我如何快速的在数据集中指定位置插入空白记录。当时我也是愣了一下,以前实现输出制作排版都是在proc report输出时进行设置的,还真没在数据集...

    Setup
  • SAS-数据步中的几个常见的小语法...

    比较基础与常见的语法,如:firstobs,obs,end...,firstobs表示从数据集第某行记录开始,obs表示读取到第某行记录。end为一个“指针”指...

    Setup
  • 快速学习-Git代码冲突解决

    虽然说上午开头说版本控制为了解决冲突,但是此冲突非彼冲突,这个冲突没有代码覆盖问题。

    cwl_java
  • AI做八年级试卷得90多分,艾伦研究所问答系统已达中学水平

    当地时间周三,西雅图艾伦人工智能研究所正式推出新 AI 系统 Aristo,该系统在八年级的科学测试中答对了 90%以上的问题,并在十二年级的测试中答对了 80...

    机器之心
  • OPNFV XCI:跨社区集成实现开放创新

    Linux基金会下的OPNFV项目是通过集成,部署和测试促进各种开源生态系统网络功能虚拟化(NFV)组件的开发和演进的开源项目,该项目目前宣布了其跨社区持续集成...

    SDNLAB
  • 从Hash Killer I、II、III论字符串哈希

    首先,Hash Killer I、II、III是BZOJ上面三道很经典的字符串哈希破解题。当时关于II,本人还琢磨了好久,但一直不明白为啥别人AC的代码都才0....

    HansBug
  • 2018年微服务的5个发展趋势

    原文地址:https://medium.com/memory-leak/5-microservices-trends-to-watch-in-2018-aed1...

    双愚
  • 肿瘤浸润免疫细胞量化分析简介

    肿瘤微环境是肿瘤细胞生存和发展的土壤,其中浸润到肿瘤局部的免疫细胞介导了肿瘤免疫微环境,tumor immune microenvironment, 简称TIM...

    生信修炼手册
  • Oracle 聚簇因子(Clustering factor)

        聚簇因子是 Oracle 统计信息中在CBO优化器模式下用于计算cost的参数之一,决定了当前的SQL语句是否走索引,还是全表扫描以及是否作为嵌套连接外...

    Leshami

扫码关注云+社区

领取腾讯云代金券