简体   繁体   中英

create “pair key=value” file with SAS datastep

I have to create a file from a dataset that is JSON style but without CR between each variable. All variables have to be on the same line.

I would like to have something like that :

ID1 "key1"="value1" "key2"="value2" .....

Each key is a column of a dataset. I work this SAS 9.3 on UNIX.

Sample : I have

ID Name Sex Age
123 jerome M 30
345 william M 26
456 ingrid F 25`

I would like

123 "Name"="jerome" "sex"="M" "age"="30"
345 "Name"="william" "sex"="M" "age"="26"
456 "Name"="ingrid" "sex"="F" "age"="25"

Thanks

If your data looked like this...

Obs     Name      _NAME_        COL1

  1    Alfred     Name      Alfred
  2    Alfred     Sex       M
  3    Alfred     Age                 14
  4    Alfred     Height              69
  5    Alfred     Weight           112.5
  6    Alice      Name      Alice
  7    Alice      Sex       F
  8    Alice      Age                 13
  9    Alice      Height            56.5
 10    Alice      Weight              84
 11    Barbara    Name      Barbara
 12    Barbara    Sex       F
 13    Barbara    Age                 13
 14    Barbara    Height            65.3
 15    Barbara    Weight              98
 16    Carol      Name      Carol
 17    Carol      Sex       F
 18    Carol      Age                 14
 19    Carol      Height            62.8
 20    Carol      Weight           102.5
 21    Henry      Name      Henry
 22    Henry      Sex       M
 23    Henry      Age                 14
 24    Henry      Height            63.5
 25    Henry      Weight           102.5

You could use code like this to write the value pairs. Assuming this is what you're talking about.

189  data _null_;
190     do until(last.name);
191        set class;
192        by name;
193        col1 = left(col1);
194        if first.name then put name @;
195        put _name_:$quote.  +(-1) '=' col1:$quote. @;
196        end;
197     put;
198     run;

Alfred "Name"="Alfred" "Sex"="M" "Age"="14" "Height"="69" "Weight"="112.5"
Alice "Name"="Alice" "Sex"="F" "Age"="13" "Height"="56.5" "Weight"="84"
Barbara "Name"="Barbara" "Sex"="F" "Age"="13" "Height"="65.3" "Weight"="98"
Carol "Name"="Carol" "Sex"="F" "Age"="14" "Height"="62.8" "Weight"="102.5"
Henry "Name"="Henry" "Sex"="M" "Age"="14" "Height"="63.5" "Weight"="102.5"
NOTE: There were 25 observations read from the data set WORK.CLASS.

Consider these non-transposing variations:

Actual JSON, use Proc JSON

data have;input
ID Name $ Sex $ Age; datalines;
123 jerome M 30
345 william M 26
456 ingrid F 25
run;

filename out temp;
proc json out=out;
  export have;
run;

* What hath been wrought ?;
data _null_; infile out; input; put _infile_; run;

----- LOG -----

{"SASJSONExport":"1.0","SASTableData+HAVE":[{"ID":123,"Name":"jerome","Sex":"M","Age":30},{"ID":345,"Name":"william","Sex":"M","Age":26},{"ID":456,"Name":"ingrid","Sex":"F","Age":25}]}

A concise name-value pair output of the variables using the PUT statement specification syntax ( variable-list ) ( format-list ), using _ALL_ for the variable list and = for the format.

filename out2 temp;
data _null_;
  set have;
  file out2;
  put (_all_) (=);
run;

data _null_;
  infile out2; input; put _infile_;
run;

----- LOG -----

ID=123 Name=jerome Sex=M Age=30
ID=345 Name=william Sex=M Age=26
ID=456 Name=ingrid Sex=F Age=25

Iterate the variables using the VNEXT routine. Extract the formatted values using VVALUEX function, and conditionally construct the quoted name and value parts.

filename out3 temp;
data _null_;
  set have;
  file out3;

  length _name_ $34 _value_ $32000;

  do _n_ = 1 by 1;
    call vnext(_name_);
    if _name_ = "_name_" then leave;
    if _n_ = 1 
      then _value_ =       strip(vvaluex(_name_));
      else _value_ = quote(strip(vvaluex(_name_)));
    _name_ = quote(trim(_name_));
    if _n_ = 1 
      then put _value_ @;
      else put _name_ +(-1) '=' _value_ @;
  end;
  put;
run;

data _null_;
  infile out3; input; put _infile_;
run;

----- LOG -----

123 "Name"="jerome" "Sex"="M" "Age"="30"
345 "Name"="william" "Sex"="M" "Age"="26"
456 "Name"="ingrid" "Sex"="F" "Age"="25"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM