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