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

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[ソフトウェア/Igor]]

#contents

* ファイル名操作用のユーティリティ関数 [#x15fe647]

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

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

使用例

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

* 文字列から両端の空白を取り除く [#cce50adb]

使用例

 LANG:Igor
 LANG:Igor(linenumber)
 print Trim("  abc    ")
 // prints "abc"
 
 print Trim("     ")
 // prints ""

コード

 LANG:Igor
 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

* 末尾の改行文字を取り除く [#xcf60978]

使用例

 LANG:Igor
 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 に到達した
        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
 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

* 文字列の先頭から指定した区切り文字までを取り去って返す [#iad4b18b]

文字列が十分に構造化されていれば、

StringFromList, NumberFromList などのリスト関数や、~
StringByKey, NumberByKey などのペア関数を使った方が楽ですが、

そうでない場合には役に立ちます。

区切り文字の前後の空白は無視されます。

使用例

 LANG:Igor
 // 始めて見付かる区切り文字までを取り去って返す
 // 区切り文字前後の空白は消去される
 string s = "text1 : text2  ;text3, text4"
 print TakeUntil(s, ":")
 // prints "text1", s == "text2  ;text3, text4"
 LANG:Igor(linenumber)
 function TestTakeUntil()
 
 // 指定した以外の区切り文字は無視する
 // 内部の空白は保存される
 print TakeUntil(s, ",")
 // prints "text2  ;text3", s == "text4"
     // 任意フォーマットの文字列
     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]"
 
 // 指定した区切り文字が見付からなければすべてを取り去って返す
 print TakeUntil(s, ",")
 // prints "text4", s == ""
     // 指定した以外の区切り文字は無視する
     // 内部の空白は保存される
     printf "[%s]  [%s]\r", TakeUntil(s, ","), s
     // prints "[text2  ;text3]  [text4]"
 
     // 指定した区切り文字が見付からなければすべてを取り去って返す
     printf "[%s]  [%s]\r", TakeUntil(s, ","), s
     // prints "text4", s == ""
 
 end

コード

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


Counter: 10933 (from 2010/06/03), today: 2, yesterday: 0