ソフトウェア/Igor/文字列関連 のバックアップ(No.3)

更新


ソフトウェア/Igor

ファイル名操作用のユーティリティ関数

":" 区切りで渡されたファイルパスを操作する関数。

同名の Delphi の関数を模したものです。

使用例

LANG:Igor(linenumber)
// ファイル名部分のみを取り出す
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 ExtractFilePath("file.ext")
// prints ""

// 拡張子は "." 付きで渡す
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(linenumber)
// ファイル名を返す
function/T ExtractFileName(filename)
string filename
   return filename[ strsearch(filename, ":", inf, 3)+1, inf]
end

// ファイルパスを返す (末尾には : が付く)
// ":" が含まれない文字列では "" が返る
function/T ExtractFilePath(filename)
string filename
    return filename[0, strsearch(filename, ":", inf, 3)]
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(linenumber)
print Trim("  abc    ")
// prints "abc"

print Trim("     ")
// prints ""

コード

LANG:Igor(linenumber)
// 両端の空白文字を取り除く
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(linenumber)
// テキストファイルの内容をテキストウェーブに読み込む
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(linenumber)
// 末尾の改行文字を取り除く
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(linenumber)
function TestTakeUntil()

    // 任意フォーマットの文字列
    string s = "text1 : text2  ;text3, text4"
    printf "[%s]\r", s
    // prints "[text1 : text2  ;text3, text4]"
    
    // 始めて見付かる区切り文字までを取り去って返す
    // 区切り文字前後の空白は消去される
    printf "[%s]  [%s]\r", TakeUntil(s, ":"), s
    // prints "[text1]  [text2  ;text3, text4]"

    // 指定した以外の区切り文字は無視する
    // 内部の空白は保存される
    printf "[%s]  [%s]\r", TakeUntil(s, ","), s
    // prints "[text2  ;text3]  [text4]"

    // 指定した区切り文字が見付からなければすべてを取り去って返す
    printf "[%s]  [%s]\r", TakeUntil(s, ","), s
    // prints "text4", s == ""

end

コード

LANG:Igor(linenumber)
function/T TakeUntil(s, delim)
string &s, delim
    variable d = StrSearch(s, delim, 0)
    string result
    if (d < 0)
        result = Trim(s)
        s = ""
        return result
    endif
    result = Trim(s[0, d-1])
    s = Trim(s[d+strlen(delim), inf])
    return result
end

Counter: 16276 (from 2010/06/03), today: 1, yesterday: 0