ソフトウェア/Igor/文字列関連 の履歴(No.2)
更新ファイル名操作用のユーティリティ関数†
":" 区切りで渡されたファイルパスを操作する関数。
同名の Delphi の関数を模したものです。
使用例
LANG:Igor // ファイル名部分のみを取り出す print ExtractFileName("c:folder1:folder2:file.ext") // prints "file.ext" // ファイル名が空の場合には空になる print ExtractFileName("c:folder1:folder2:") // prints "" // パス部分のみを取り出す print ExtractFilePath("c:folder1:folder2:file.ext") // prints "c:folder1:folder2:" // 末尾に ":" が付くのでファイル名とそのまま結合できる print ExtractFilePath("c:folder1:folder2:file.ext") + "newfile.ext" // prints "c:folder1:folder2:newfile.ext" // 拡張子は "." 付きで渡す print ChangeFileExt("c:folder1:folder2:file.ext", ".txt") // prints "c:folder1:folder2:file.txt" // ext に "" を渡せば拡張子を取り除ける print ChangeFileExt("c:folder1:folder2:file.ext", "") // prints "c:folder1:folder2:file" // "." が2つあれば後ろが拡張子を表わすものと考える print ChangeFileExt("c:folder1:folder2:file.ext1.ext2", ".txt") // prints "c:folder1:folder2:file.ext1.txt"
コード
LANG:Igor // ファイル名を返す function/T ExtractFileName(filename) string filename return filename[ strsearch(filename, ".", inf, 3)+1, inf] end // ファイルパスを返す (末尾には : が付く) function/T ExtractFilePath(filename) string filename return filename[0,strlen(filename)-strlen(ExtractFileName(filename))-1] end // filename の最後の . 以降を取り除いたものに ext を付ける function/T ChangeFileExt(filename, ext) string filename, ext variable i = strsearch(filename, ".", inf, 3) if(i<0) return filename + ext else return filename[0,i-1] + ext endif end
文字列から両端の空白を取り除く†
使用例
LANG:Igor print Trim(" abc ") // prints "abc" print Trim(" ") // prints ""
コード
LANG:Igor // 両端の空白文字を取り除く function/T Trim(s) string s variable i, l = strlen(s) for(i=0; i < l && char2num(s[i]) == char2num(" "); i+=1) ; endfor s = s[i, inf] for(i=strlen(s)-1; i >= 0 && char2num(s[i]) == char2num(" "); i-=1) ; endfor return s[0, i] end
末尾の改行文字を取り除く†
使用例
LANG:Igor // テキストファイルの内容をテキストウェーブに読み込む function ReadTextFileIntoTextWave(filename, textwave) string filename wave/t textwave variable f open/R/Z=2 f as file_name if(!f) print "File not found." return 0 endif Redimension/N=0 textwave // 一旦クリア for(;;) freadline f, s // 一行読む if(strlen(s)==0) // eof に到達した break endif Redimension/N=(numpnts(textwave)+1) textwave // 一行増やす // FReadLine の結果は gets と同様末尾に改行文字が付くので、 // それを取り去ってから格納する textwave[numpnts(textwave)-1] = RemoveNewLine(s) // 最終行に格納 endfor close f return 1 end function test() make/T/O textwave ReadTextFileIntoTextWave("somefile.txt", textwave) end
コード
LANG:Igor // 末尾の改行文字を取り除く function/T RemoveNewLine(s) string s variable i for(i=strlen(s)-1; i >= 0 && IsNewLine(s[i]) ; i-=1) ; endfor return s[0, i] end // 与えられた文字が改行文字かどうかを判別 function IsNewLine(c) string s return char2num(c)==13 || char2num(c)==10 end
文字列の先頭から指定した区切り文字までを取り去って返す†
文字列が十分に構造化されていれば、
StringFromList, NumberFromList などのリスト関数や、
StringByKey, NumberByKey などのペア関数を使った方が楽ですが、
そうでない場合には役に立ちます。
区切り文字の前後の空白は無視されます。
使用例
LANG:Igor // 始めて見付かる区切り文字までを取り去って返す // 区切り文字前後の空白は消去される string s = "text1 : text2 ;text3, text4" print TakeUntil(s, ":") // prints "text1", s == "text2 ;text3, text4" // 指定した以外の区切り文字は無視する // 内部の空白は保存される print TakeUntil(s, ",") // prints "text2 ;text3", s == "text4" // 指定した区切り文字が見付からなければすべてを取り去って返す print TakeUntil(s, ",") // prints "text4", s == ""
コード
LANG:Igor function/T TakeUntil(s, delim) string &s, delim variable d = StrSearch(s, delim, 0) if (d < 0) s = Trim(s) return "" endif string result = Trim(s[0, d-1]) s = Trim(s[d+strlen(delim), inf]) return result end
Counter: 17740 (from 2010/06/03),
today: 5,
yesterday: 3