2019年10月7日月曜日

MELでファイルの内容を読み込んでみる

fwriteAll~と一緒にファイルを読み込むための freadAllLines と freadAllText というコマンドが追加されました。

maya でも mayaLT でも使用できるので、fwriteAll~と併せて fgetline や fgetword から切り替えていきたいコマンドです。



昔から存在する fgetline や fgetword を使用するためには
{
    $fileId =`fopen $exampleFileName "r"`;
    string $nextLine =`fgetline $fileId`;
    while( size( $nextLine ) > 0 )
    {
        print( $nextLine );
        $nextLine =`fgetline $fileId`;
    }
    fclose $fileId;
    
}

こんな感じで while が入るため無限ループの危険が付きまといます。
freadAll~も fwriteAll~ と同様にコマンドと読み込むファイル名を指定するだけと、使用方法が簡素になりました。

まずは取り込むためのテキストファイルを作成。
{
    string $file1 = "d:/lf.txt";
    string $file2 = "d:/crlf.txt";

    string $obj[] = `polyCube`;
    string $vtxs[]= `polyListComponentConversion -tv $obj[0]`;
    $vtxs = `ls -fl $vtxs`;

    // fwriteAllText
    string $oText;
    for($vtx in $vtxs) $oText+=($vtx+"\n");
    int $result1 = `fwriteAllText $file1 $oText`;

    // fwriteAllLines
    int $result2 = `fwriteAllLines $file2 $vtxs`;

}
今回はそんな長文にならないよう polyCube の頂点を出力してみました。


そしてファイルの読み込み。

まずは freadAllText のほうから。
{
    string $lf   = "d:/lf.txt";
    string $crlf = "d:/crlf.txt";
    
    string $allTextLf  =freadAllText($lf);
    string $allTextCrlf=freadAllText($crlf);

    print("\n-- allTextLf   ----\n");
    print($allTextLf);
    if(`gmatch $allTextLf "*\r*"`) print("true\n");
    else print("false\n");

    print("\n-- allTextCrlf ----\n");
    print($allTextCrlf);
    if(`gmatch $allTextCrlf "*\r*"`) print("true\n");
    else print("false\n");
}
freadAllText はファイルの内容を文字列へ読み込みます。
なので、$allTextLf、$allTextCrlfを print すると、こんな風に履歴が出ます。

fwriteAlltext と fwriteAllLinesで追加している・されている改行コードによりリストっぽく表示されています。
ここから1つの文字列を改行コードで配列に分割する感じでしょうか。その時注意することは fwriteAllLinesでは必ず改行コードに"\r\n"
が付いてしまうという事。15行目の gmatch "*\r*" で true が出ています。


次に freadAllLines。
{
    string $lf   = "d:/lf.txt";
    string $crlf = "d:/crlf.txt";

    string $allLinesLf[]  =freadAllLines($lf);
    string $allLinesCrlf[]=freadAllLines($crlf);

    print("\n-- allLinesLf   ----\n");
    print($allLinesLf);
    if(`gmatch $allLinesLf[0] "*\n*"`
     ||`gmatch $allLinesLf[0] "*\r*"`) print("true\n");
    else print("false\n");

    print("\n-- allLinesCrlf ----\n");
    print($allLinesCrlf);
    if(`gmatch $allLinesCrlf[0] "*\n*"`
     ||`gmatch $allLinesCrlf[0] "*\r*"`) print("true\n");
    else print("false\n");
    
}
こちらはファイルのテキスト行を文字列の配列に読み込みます。履歴はこんな風に出力されます。

見た目には freadAllTextと同じようにい見えますが、このコマンドでファイルを読み込むと、なんと、改行コードが除去されているのです。
gmatch も両方 falseが出ています。
なかなか便利ですね。

これだと、freadAllTextの存在意義が分からなくなりますが、あるという事は何かに使えるんでしょうね・・・。


0 件のコメント:

コメントを投稿