BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
sasone
Quartz | Level 8

いつも大変お世話になっております。

 

以下のようにpath1,path2の2つの絶対パスがあったとします。

 

%let path1=D:\adam\programs;

%let path2=D:\adam\datasets;

 

path1がカレントフォルダで、path2が対象とするフォルダのイメージなのですが、
このときpath1から見たpath2の相対位置を簡単に自動で返す関数などは
ございますでしょうか。
戻り値は"..\datasets"のように返って来ましたら有難いです。

 

分かりましたらご教示のほどよろしくお願いいたします。

1 ACCEPTED SOLUTION

Accepted Solutions
yu_sas
SAS Employee

関数はないように思います。

 

もしDATAステップで実施するなら、SCAN、SUBSTR、INDEX関数などで共通部分を削除し

COUNT、CAT関数などで繰り返し"..\"を補うようなロジックで可能かなと思います。

うまくいかない時は、作成したコードをポストしてみてくださいSmiley Happy

View solution in original post

4 REPLIES 4
yu_sas
SAS Employee

関数はないように思います。

 

もしDATAステップで実施するなら、SCAN、SUBSTR、INDEX関数などで共通部分を削除し

COUNT、CAT関数などで繰り返し"..\"を補うようなロジックで可能かなと思います。

うまくいかない時は、作成したコードをポストしてみてくださいSmiley Happy

sasone
Quartz | Level 8

yu_sasさま

 

早速にも有難うございました。
やはり関数はないですか。
それでは何とかDATAステップで作ってみたいと思います。

有難うございました。

amatsu
Obsidian | Level 7

追記:

以下で示した方法ですが、取得する相対パスの文字数が79バイト以上になる場合、

パスが79バイトずつ分割されて別々のオブザベーションに格納されちゃいました。

何かオプションを追加すれば行けると思いますが、ちょっと簡単に調べられませんでした。ご注意くださいませ。。

---------------------------

 

こんにちは。

関数は無いですが、windowsでpowershellが使える環境でしたら以下のようにfilenameのpipeエンジン使って相対パスを取得する事は出来るかと思います。

 

%let path1=D:\adam\programs;
%let path2=D:\adam\datasets;

filename test pipe "powershell -command push-location %bquote(')&path1%bquote('); resolve-path %bquote(')&path2%bquote(') -relative";

data out1;
 infile test lrecl=2000;
 input;
 length rel_path $2000.;
 rel_path = _infile_;
run;

 

sasone
Quartz | Level 8

amatsuさま

 

素晴らしいプログラムを有難うございました!
バッチリ相対パスが取得できました!

 

追記:

---------------------------

amatsuさま

わざわざご丁寧にも追記下さりありがとうございました。

相対パスの文字数が79バイト以上にならない環境で使用させていただきます。