LoginSignup
1
1

More than 1 year has passed since last update.

Igor proで特定のディレクトリ以下のすべてのファイルパスを取得する。

Posted at

はじめに

Igor proはpxpファイル内にデータを格納できます。また、pxpファイル内にディレクトリを作ることができ、複数の似たようなデータを解析する際にデータを分けることができて便利です。

データが多くなってくると、解析を一つ一つ打ち込んでやるのが大変になってきます。特に解析条件を変えて何度も となると嫌になります。

そこで、カレントディレクトリ以下に存在するファイルパスを取得できれば、ループに組み込んですべてのデータに同じ解析をできると思いました。

正直、ほかの言語なら全くどうということのないことなのですが、Igor proは情報が少なくて若干苦労したので残しておきます。

たぶん組み込み関数をちゃんと知っている人ならもっと簡単なコードでかけるんだと思います。わかる人いらっしゃったら教えてください。
あとコードの汚さはご容赦いただけますと幸いです。

コード

GetFilePaths
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

使いかた

image.png
上図のようなデータの構造になっていた際に下記のGetFilePaths()を実行すると
image.png

このような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でサブディレクトリ以下のすべてのファイルパスを取得する方法についてまとめました。

1
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1