ラベル ODS CSV の投稿を表示しています。 すべての投稿を表示
ラベル ODS CSV の投稿を表示しています。 すべての投稿を表示

エクセルで開いても前ゼロが消えないcsvをods csvで作る話

ods csvのマニアックな話です。

data Q1;
X=1;Y='001';Z='A';output;
X=2;Y='002';Z='B';output;
run;







のような前ゼロがあるデータを考えます。

ods csv file='/folders/myfolders/A1.csv';
proc print data=Q1 noobs;
run;
ods csv close;

として
A1.csvをノートパッド等テキストエディタで開いてみます。










となっています。

同じファイルをEXCEL等のスプレッドシートソフトで開いてみると

のように前ゼロが取れて表示されます。
よく知られた話だと思います。

EXCELで開いても、前ゼロがとれないようにすることできないかな~って考えます。
何のためにか?ただの興味です。

まずはquote_by_typeでクォートしちゃいます。

ods csv file='/folders/myfolders/A2.csv' options(quote_by_type="Yes" );
proc print data=Q1 noobs;
run;
ods csv close;

テキストエディタで開くと

さて、今度はいけるかな~??









はい無理でした~。


最後は、Prepend_Equalsをつけてみます。

ods csv file='/folders/myfolders/A3.csv' options(Prepend_Equals='Yes' quote_by_type="Yes" );
proc print data=Q1 noobs;
run;
ods csv close;

すると、以下のようになんか前に「=」とかつきだしました









今度こそ!!









できた!!わ~い!!


しかし、できたけど、csvって、他のシステムと読み書きでデータの受け渡ししやすいから使うこと
多いわけで、EXCELで確認するときに前ゼロがつく代償に、こんな余計なもんついたcsv作ってもな~。

ods csvってcsv以外も作れたんだって話とoptions(doc='Help')の話

ちょっとした話です。

ods csvって、csv専用のods出力形式だと思ってたんですが

data Q1;
A=1;B=2;C='A';
run;

ods csv file='/folders/myfolders/A1.txt' options(delimiter='@');
proc print data = Q1 noobs;
run;
ods csv close;




って感じで、options(delimiter='@')でデリミタを何にでも変えれたんですね。へ~、まあ確かにできそうだけど、気が付かなかった。

と、こんな風に、ods csvやods tagsets.excelxpにどういうオプションがあるかってわからないってときは

ods csv file='/folders/myfolders/dummy.csv' options(doc='Help');
ods csv close;

ods tagsets.excelxp file='/folders/myfolders/dummy.xml' options(doc='Help');
ods tagsets.excelxp close;


とこんな風にdummyの外部ファイルを指定して、options(doc='Help'); とすると

ログに





















っとこんな風にパラメータと、デフォルト値、説明がダーッとでてきます(英語だけど)。


ちょっと遅いですけど、バレンタインデーに絡んだ海外のSASネタを紹介

「Have a traditional SAS/Graph Valentine's Day!」

「Binary heart in SAS」

「What chocolate is best for Valentine’s Day? Not cocoa powder」

海外の人は、真面目にアホみたいなことするからカッコいいですよね。





ODS CSVとODS CSVALLと ODS tagsets.CSVBYLINEの違い

CSV、ファイル形式としてあんまり好きじゃないですが、やっぱり、CSVでデータ送ったり送られたりは避けがたい時があります。

SASからCSVを作る方法はたくさんあって、fileステートメントとputでもいいし、EXPORTプロシジャでもいいし、%DS2CSVっていうデフォルトで用意されているマクロを使ってもできます。

で、一口にCSVといってもクォート文字で包んだり包まなかったり、変数を1行目にだしたりださなかったり、区切り文字をカンマ以外にしたり(そしたらCSVとは言わないか)とか色々あって、また改行コードが入ってたり、欠損があった場合とかして、読み込むのも吐き出すのも結構奥深い世界です。詳しくないです。

うまく読み込めなかったり、吐き出しが変なところで改行されて崩れたりして、イーってなることは日常茶飯事です。単純な作業のはずなのにうまくいかないのが余計むかつきます。

今回紹介するのはODSで作っちゃうパターンの話です。

ところが、一口にODSでCSVといっても、実はいくつか選択の幅があります。その話です。

data A;
X=1;Y=1;Z='い';output;
X=1;Y=2;Z='ろ';output;
X=2;Y=3;Z='は';output;
run;

ods csv file="D:\SAMPLE1.csv";
ods csvall file="D:\SAMPLE2.csv"  ;
ods tagsets.csvbyline file="D:\SAMPLE3.csv"  ;
proc print data=A noobs;
run;
ods csv close;
ods csvall close;
ods tagsets.csvbyline  close;

上のコードは、printプロシジャの出力を3種類の形式でCSVファイル化しています。

以下、実際作成されるCSVの中身です

【ODS CSV】










【ODS CSVALL】












【ODS tagsets.csvbyline】











tagsets.csvbylineの特徴がわかりにくいので

ods csv file="D:\ods_CSV.csv"  ;
ods csvall file="D:\ods_CSVALL.csv"  ;
ods tagsets.csvbyline file="D:\TAGSETS_CSVBYLINE.csv"  ;
title "プロシジャのタイトル";
   proc print  data=A NOOBS;
   by X;
   run;
ods csv close;
ods csvall close;
ods tagsets.csvbyline  close;

とタイトルとbyつけてみます。


【ODS CSV】












【ODS CSVALL】

















【ODS tagsets.csvbyline】














って感じです。

まあ、実際、そんな変則的な出力を敢えてCSV形式でださなければいけないシチュエーションって
なんだろうって気がしますが。