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