#module
#deffunc getdiminfo val, int
mref pval, 1024 : mref dnum, 1
mref stt, 64
stt = dnum + 2
stt = pval.stt
if (pval & $FFFF = 2) && (dnum = 0) : stt = stt * 4
return
#deffunc csvtoarray val, val
mref sv, 56 : mref gv, 25
i = 0, 0, 0 // 2次元目の要素, 開始位置, 行区切り位置
ckugiri = "," : rkugiri = "\n" // 1次元目区切り文字, 2次元目区切り文字
strlen len.0, gv
strlen len.1, ckugiri
strlen len.2, rkugiri
getdiminfo sv, 0 : size.0 = stat // 1要素のバッファサイズ
getdiminfo sv, 1 : size.1 = stat // 1次元目の要素数
getdiminfo sv, 2 : size.2 = stat // 2次元目の要素数
sdim rdat, size.0 * size.1 + 1
repeat
// 要素数よりも大きい分は代入しない
if cnt >= size.2 : break
// 1行分のデータ抽出
instr i.2, gv, rkugiri, i.1
if i.2 = -1 {
strmid rdat, gv, i.1, len.0
if rdat = "" : break
} else {
strmid rdat, gv, i.1, i.2
}
// 1行の長さ取得
strlen len.3, rdat
i.3 = 0, 0 // 1行内の開始位置, カンマ区切り位置
repeat
// 要素数よりも大きい分は代入しない
if cnt >= size.1 : break
// カンマ毎のデータ抽出
instr i.4, rdat, ckugiri, i.3
if i.3 + i.4 <= i.3 {
if len.3 - 1 > i.3 {
if len.3 - i.4 >= size {
strmid sv.cnt.i, rdat, i.3, size // 配列の要素サイズ以下なら全て代入
} else {
strmid sv.cnt.i, rdat, i.3, len.3 - 1 // 配列の要素より大きい分は代入しない
}
}
break
}
if i.4 >= size {
strmid sv.cnt.i, rdat, i.3, size // 配列の要素サイズ以下なら全て代入
} else {
strmid sv.cnt.i, rdat, i.3, i.4 // 配列の要素より大きい分は代入しない
}
i.3 += i.4 + len.1
loop
i.0++ : i.1 += len.3 + len.2
loop
return
#global
sdim ary, 10, 7, 4
sdim csv, 200
sdim genre, 5, 4
genre = "OS", "衣服", "食べ物", "国"
csv = {"
3.1,95,98,Me,2000,XP,Vista
Tシャツ,スーツ,ドレス
パン,野菜,肉,魚,米
日本,アメリカ,ロシア,中国
"}
csvtoarray ary, csv // CSVデータを配列に格納
repeat 7
pos cnt * 80 + 100, 10 : mes cnt
loop
repeat 4
row = cnt
pos 10, row * 30 + 50 : mes "<" + genre.row + ">"
repeat 7
pos cnt * 80 + 100, row * 30 + 50 : mes ary.cnt.row
loop
loop
stop
|