はじめに
Igor proはpxpファイル内にデータを格納できます。また、pxpファイル内にディレクトリを作ることができ、複数の似たようなデータを解析する際にデータを分けることができて便利です。
データが多くなってくると、解析を一つ一つ打ち込んでやるのが大変になってきます。特に解析条件を変えて何度も となると嫌になります。
そこで、カレントディレクトリ以下に存在するファイルパスを取得できれば、ループに組み込んですべてのデータに同じ解析をできると思いました。
正直、ほかの言語なら全くどうということのないことなのですが、Igor proは情報が少なくて若干苦労したので残しておきます。
たぶん組み込み関数をちゃんと知っている人ならもっと簡単なコードでかけるんだと思います。わかる人いらっしゃったら教えてください。
あとコードの汚さはご容赦いただけますと幸いです。
コード
Function/wave GetSubDirNames()
String SubDirName
Variable index = 0
Variable NumOfSubDirs = countobjects(":", 4)
make/T/o/n=(NumOfSubDirs) SubDirNames
do
SubDirName = GetIndexedObjName(":", 4, index)
SubDirNames[index] = SubDirName
if (strlen(subDirName) == 0)
break
endif
index += 1
while(index<NumOfSubDirs)
return subDirnames
End
Function GetFilePaths()
wave/t SubDirNames
String FileName
Variable index = 0
variable i=0
variable j=0
variable cnt=0
make/T/o tempFilePaths = ""
wave/t SubDirNames = GetSubDirNames()
variable NumOfSubDirs = dimsize(SubDirNames, 0)
do
String currentDir = ":"+ SubDirNames[j]
i=0
do
Variable NumOfFiles = countobjects(currentDir, 1)
FileName = GetIndexedObjName(CurrentDir, 1, i)
if (strlen(FileName) == 0)
break
endif
tempFilepaths[cnt] = CurrentDir + ":" + FileName
cnt+=1
i+=1
while(i<NumOfFiles)
j+=1
while(j<NumofSubDirs)
duplicate/t/o/R=[0,cnt-1] tempfilePaths Filepaths
killwaves tempfilepaths, SubdirNames
End
使いかた
上図のようなデータの構造になっていた際に下記のGetFilePaths()を実行すると
このようなpathをまとめたwave, Filepathsが手に入ります。
あとは一つ一つのwaveを処理するには
make/o temp = $filepaths[0]
のような形で取り出せばよいと思います。
実用の際には、上記でwaveのコピーを作って、処理をして別のWaveに格納
を繰り返すループを使いました。
ポイント
正直ポイントは GetIndexedObjName(sourceFolderStr, objectType, index)だけです。 (ただしこれにたどり着くにも少し時間がかかった)
この関数は、指定されたディレクトリ (SourceFolderStr) の特定のオブジェクト (ObjectType)の指定番目 (index) を返すというものです。指定番目ではなく、全てのファイルパスをリストにして返す という関数があればよかったのですが、少し調べた感じではなかったので、ややてこずりながら作る羽目に・・・
ちなみに
Objecttype=1 はファイル
Objecttype=4はディレクトリです。
注意
Igor proでは、数字のみのフォルダ名やwave名はシングルクォーテーションを付けて表現しています。
例えば上記で、サブディレクトリの名前を1225 などとしていた場合、'1225'と指定することが必要です。その場合には上記のスクリプトでは動かないので注意してください。
あとこれは私が引っかかった部分ですが、
make/o temp = $filepaths[0]
の部分で、\$FilePaths[0]をFilepaths[0]にすると動きません。$を付けなかった場合、データ型がStringになるので、パス指定には使えないからです。
おわりに
igor proでサブディレクトリ以下のすべてのファイルパスを取得する方法についてまとめました。