2019年6月3日月曜日

やっぱstringToStringArrayってバグってね?

けっこう前に stringToStringArray コマンドで変な結果になるとか書きましたが、Pythonではどうなっているか、折角なので比べてみようと思います。



まずは比較用スクリプト。
{
    string $csvLine="A,B,,D,E,F,";
    
    string $array[]=stringToStringArray($csvLine,",");
    print("-- MEL --\n");
    for($i=0; $i<`size $array`; $i++) print($i+": '"+$array[$i]+"'\n");
    
    string $split[]=python("'"+$csvLine+"'.split(',')");
    print("-- python --\n");
    for($i=0; $i<`size $split`; $i++) print($i+": '"+$split[$i]+"'\n");
    
}

結果はこうなりました。
-- MEL --
0: 'A'
1: 'B'
2: 'D'
3: 'E'
4: 'F'
-- python --
0: 'A'
1: 'B'
2: ''
3: 'D'
4: 'E'
5: 'F'
6: ''

やはりカンマの連続する部分は、python みたいに null の配列ができてくれたほうが自然な気がします。
まぁ、MELにも思想信条があると思うので優劣をつけようとは思いませんが、今度からMELでCSVを配列にするような場合は、pythonコマンドから split を使用した方がバグになりにくそうではあります。

ちなみに python コマンドの split で stringToStringArray みたいに空配列を詰める場合、
{
    string $csvLine="A,B,,D,E,F,";
    
    string $py;
    $py="def myProc(arg):\n"    
       +"    l = []\n"
       +"    for v in arg.split(','):\n"
       +"        if not v == '':\n"
       +"            l.append(v)\n"
       +"    return l";
    
    python($py);
    string $split[]=python("myProc('"+$csvLine+"')");
    for($i=0; $i<`size $split`; $i++) print($i+": "+$split[$i]+"\n");
}

としてみたりします。
でも、これはちょっと長すぎですね。
※l.append(v) みたいに属性へアクセスせず、
apnd = l.append
for v in ~:
    apnd(v)
とローカル変数へのアクセスにすると少し高速化できるらしい。

 なので、リスト内包表記を試してみます。
{
    string $csvLine="A,B,,D,E,F,";
    
    string $split[]=python("[v for v in '"+$csvLine+"'.split(',') if not v == '']");
    
    for($i=0; $i<`size $split`; $i++) print($i+": "+$split[$i]+"\n");
    
}

スッキリしました。
素直に stringToStringArray 使えってかんじですが、pythonコマンドの練習だったりするのです。


0 件のコメント:

コメントを投稿