|
|
2012/4/9(Mon) 20:45:57|NO.45985
CSV形式の文字変数を2次元配列(int型)に変換したいのですが効率のいい方法が思い浮かびません
教えてくださいorz
ちなみにCSV形式っていうのは「,」で数値を区切っている配列のことで、
二次元方向は改行で表されてます。
|
|
2012/4/9(Mon) 21:01:35|NO.45987
こういうことですか?
sdim buf,10000
notesel buf
buf={"1,5,6,8,9
0,8,9,4,7
5,8,9,7,9
3,8,7,9,2
2,7,9,6,3"}
sdim a,100,100
repeat notemax
cy=cnt
noteget tmp,cnt
sdim t,100,100
split tmp,",",t
repeat 6
cx = cnt
a(cx,cy)=strtrim(t(cx))
loop
loop
repeat notemax
cy=cnt
repeat 6
cx=cnt
pos cx*100,cy*20:color 0,0,0
if cx=1:color 200,0,0
mes a(cx,cy)
loop
loop
stop
|
|
2012/4/9(Mon) 21:11:22|NO.45988
int型なのでこうでは?
dat = {"1,4,5,2,8
3,5,0,1,3
2,9,3,4,7
6,2,8,0,4
9,0,1,7,6"}
dim res, 5, 5
notesel dat
repeat noteinfo(0)
c = cnt
noteget buf, c
split buf, ",", bufary
foreach(bufary)
res(cnt, c) = int(bufary(cnt))
wait 0
loop
loop
mes "Results:"
repeat length(res)
c = cnt
b = "#" + c + " : "
repeat length2(res)
b += "" + res(cnt, c) + " "
wait 0
loop
mes b
loop
|
|
2012/4/9(Mon) 21:15:25|NO.45989
二人とも早い回答ありがとうございます
実はその方法なら考えたんですがなんか無駄のような気がして専用の命令があるのかな?と思って質問しました。
まあ無さそうなのでその方法を使わせて頂きます。
|
|
2012/4/9(Mon) 21:21:07|NO.45990
あと追加で質問なんですが、csv文書から毎回文字列操作でデータを抜き取る方法と、
はじめに上記の方法で二次元配列を作ってからデータを取る方法、
どちらが効率的でしょうか?
マップデータに使うので描画の際に早いほうがいいです。
|
|
2012/4/9(Mon) 21:28:08|NO.45992
マップ描画では毎回文字列操作でデータを抜き取る方法を使っています。
|
|
2012/4/9(Mon) 22:14:26|NO.45993
計測するスクリプト
#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"
#func timeBeginPeriod "timeBeginPeriod" int, int
#func timeEndPeriod "timeEndPeriod" int, int
timeBeginPeriod hwnd, 1
onexit *exit
num = 10000// 10000回実行します。処理が遅い場合は減らし、早すぎる(100msec.程度)場合は増やしてください。
dat = {"1,4,5,2,8
3,5,0,1,3
2,9,3,4,7
6,2,8,0,4
9,0,1,7,6"}
dim res, 5, 5
notesel dat
repeat noteinfo(0)
c = cnt
noteget buf, c
split buf, ",", bufary
foreach(bufary)
res(cnt, c) = int(bufary(cnt))
wait 0
loop
loop
t = timeGetTime()
repeat num
b = ""
repeat length(res)
c = cnt
b += "#" + c + " : "
repeat length2(res)
b += "" + res(cnt, c) + " "
wait 0
loop
b += "\n"
loop
loop
t1 = timeGetTime() - t
mes b
t = timeGetTime()
repeat num
b = ""
repeat noteinfo(0)
c = cnt
b += "#" + c + " : "
noteget buf, c
split buf, ",", bufary
foreach(bufary)
b += "" + int(bufary(cnt)) + " "
wait 0
loop
b += "\n"
loop
loop
t2 = timeGetTime() - t
mes b
dialog "配列にする方:" + t1 + "msec.\n毎回抜き出す方:" + t2 + "msec.\n数値が少ない方が早いってことです。", 0, "結果発表"
*exit
timeEndPeriod hwnd, 1
end
こちらでは配列にする方が早かったです。
| |
|
2012/4/10(Tue) 11:09:25|NO.45998
「CSV形式の文字」の内容によっては簡単になるでしょう。
(もう解決済みだったか。)
|
|
2012/4/10(Tue) 16:24:03|NO.46004
もう解決してるので付記として。
SQLiteのコマンドラインおよびDLL、そしてSQLeleを使えば、
1:csvファイルをSQLテーブルに読み込む
2:SQLテーブルをSELECTする
の2ステップでcsvデータを2次元配列に取り込めます。
別途、SQLiteの使い方を勉強する必要がありますが、一度覚えたらヤミツキに
なるほどSQLは楽しいのでぜひ覚えなさいということで。(´ω`)
|
|
2012/4/10(Tue) 20:11:05|NO.46012
みなさん色々検証いただいてもらって申し訳ないんですが、
マップエディタを作ってbsaveでセーブして、bloadで読み取るということが一番簡単で楽そうな
方法だったのでそれを使うことにしました。
SQLiteの方なんですが、なんとなく魅力的だったので個別に勉強していきたいと思います。
|
|