まずは比較用スクリプト。
{ 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 件のコメント:
コメントを投稿