HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0409
@keyCSV形式9解決


@key

リンク

2012/4/9(Mon) 20:45:57|NO.45985

CSV形式の文字変数を2次元配列(int型)に変換したいのですが効率のいい方法が思い浮かびません
教えてくださいorz
ちなみにCSV形式っていうのは「,」で数値を区切っている配列のことで、
二次元方向は改行で表されてます。



この記事に返信する


cats

リンク

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



hexa.hemi

リンク

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



@key

リンク

2012/4/9(Mon) 21:15:25|NO.45989

二人とも早い回答ありがとうございます
実はその方法なら考えたんですがなんか無駄のような気がして専用の命令があるのかな?と思って質問しました。
まあ無さそうなのでその方法を使わせて頂きます。



@key

リンク

2012/4/9(Mon) 21:21:07|NO.45990

あと追加で質問なんですが、csv文書から毎回文字列操作でデータを抜き取る方法と、
はじめに上記の方法で二次元配列を作ってからデータを取る方法、
どちらが効率的でしょうか?
マップデータに使うので描画の際に早いほうがいいです。



cats

リンク

2012/4/9(Mon) 21:28:08|NO.45992

マップ描画では毎回文字列操作でデータを抜き取る方法を使っています。



hexa.hemi

リンク

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
こちらでは配列にする方が早かったです。



KA

リンク

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は楽しいのでぜひ覚えなさいということで。(´ω`)



@key

リンク

2012/4/10(Tue) 20:11:05|NO.46012

みなさん色々検証いただいてもらって申し訳ないんですが、
マップエディタを作ってbsaveでセーブして、bloadで読み取るということが一番簡単で楽そうな
方法だったのでそれを使うことにしました。

SQLiteの方なんですが、なんとなく魅力的だったので個別に勉強していきたいと思います。



ONION software Copyright 1997-2021(c) All rights reserved.