開発wikiでCSVモジュールがありますが
一行単位なのでまとめて読み込むモジュールがあると
便利かな?と思ったので書きました
特殊文字は特殊文字を展開するモジュールの完成待ち

FILE名:FILE_CSV_task.hsp
#include "hsp3util.as"

//	CSV_task Module
//	CSVの読み込み、数え上げ、分割などを行う

//	module変数
//	file_name:読み込むCSVのFILEの名前
//	x:CSVの横の数
//	y:CSVの縦の数
//	youso:文字列2次元配列。CSVの各要素をこの配列に代入する
#module CSV_task file_name,x,y,youso
//	コンストラクタ。name:読み込むCSVのFILEの名前
#modinit str name
file_name=name
x=0:y=0
sdim tmp4note,4000
//	CSVの縦と横を数える
count2csv_at_CSV_task thismod,tmp4note,file_name,x,y
//	CSVの縦と横を数えたので、その結果をもとに配列を確保
sdim youso,256,x,y
sdim tmp4array,256,y
//	読み込んだテキストFILEを配列に代入
note2array tmp4array,tmp4note
repeat y
//	一行を分割
my_split_at_CSV_task thismod,tmp4array(cnt),cnt
loop
sdim tmp4note,1
sdim tmp4array,1
return

//	CSVの横の数のgetter
#modcfunc get_x_at_CSV_task
return x
//	CSVの縦の数のgetter
#modcfunc get_y_at_CSV_task
return y
//	CSVのFILEの名前のgetter
#modcfunc get_file_name_at_CSV_task
return file_name
//	CSVの配列化したものの配列の1次元目のgetter
#modcfunc get_array_x_at_CSV_task
return length(youso)
//	CSVの配列化したものの配列の2次元目のgetter
#modcfunc get_array_y_at_CSV_task
return length2(youso)
//	CSVの要素を取得
#modcfunc get_one_youso_at_CSV_task int p_x,int p_y
if p_x>=length(youso){
logmes "get_one_youso_at_CSV_task内のerror"
logmes "引数p_xの値が大きすぎます"
logmes "引数p_x:"+p_x+"length(youso)"+length(youso)
return "NIL"
}
if p_x<=-1{
logmes "get_one_youso_at_CSV_task内のerror"
logmes "引数p_xの値が小さすぎます"
logmes "引数p_x:"+p_x
return "NIL"
}
if p_y>=length2(youso){
logmes "get_one_youso_at_CSV_task内のerror"
logmes "引数p_yの値が大きすぎます"
logmes "引数p_y:"+p_y+"length2(youso)"+length2(youso)
return "NIL"
}
if p_y<=-1{
logmes "get_one_youso_at_CSV_task内のerror"
logmes "引数p_yの値が小さすぎます"
logmes "引数p_y:"+p_y
return "NIL"
}
return youso.p_x.p_y
//	CSVのp_n番目の横列に指定した文字列があるか?
//	p_index番目から調べ始める
//	指定した文字列がなければ-1を返す
#modcfunc CSV_serch_x_at_CSV_task str p_str,int p_n,int p_index
if p_n>=length2(youso){
logmes "CSV_serch_x_at_CSV_task内のerror"
logmes "引数p_nの値がlength2(youso)以上です"
logmes "引数p_n:"+p_n+"length2(youso):"+length2(youso)
return-2
}
if p_n<=-1{
logmes "CSV_serch_x_at_CSV_task内のerror"
logmes "引数p_nの値が-1以下です"
logmes "引数p_n:"+p_n
return-2
}
if p_index>=length(youso){
logmes "CSV_serch_x_at_CSV_task内のerror"
logmes "引数p_indexの値がlength(youso)以上です"
logmes "引数p_index:"+p_index+"length(youso):"+length(youso)
return -2
}
if p_index<=-1{
logmes "CSV_serch_x_at_CSV_task内のerror"
logmes "引数p_indexの値が-1以下です"
logmes "引数p_index:"+p_index
return-2
}
i=0
for i,p_index,length(youso),1
if youso.i.p_n == p_str{
return i-p_index}
next
return -1
//	CSVのp_n番目の縦列に指定した文字列があるか?
//	p_index番目から調べ始める
//	指定した文字列がなければ-1を返す
#modcfunc CSV_serch_y_at_CSV_task str p_str,int p_n,int p_index
if p_n>=length(youso){
logmes "CSV_serch_y_at_CSV_task内のerror"
logmes "引数p_nの値がlength(youso)以上です"
logmes "引数p_n:"+p_n+"length(youso):"+length(youso)
return-2
}
if p_n<=-1{
logmes "CSV_serch_y_at_CSV_task内のerror"
logmes "引数p_nの値が-1以下です"
logmes "引数p_n:"+p_n
return-2
}
if p_index>=length2(youso){
logmes "CSV_serch_y_at_CSV_task内のerror"
logmes "引数p_indexの値がlength2(youso)以上です"
logmes "引数p_index:"+p_index+"length2(youso):"+length2(youso)
return -2
}
if p_index<=-1{
logmes "CSV_serch_y_at_CSV_task内のerror"
logmes "引数p_indexの値が-1以下です"
logmes "引数p_index:"+p_index
return -2
}
i=0
for i,p_index,length2(youso),1
if youso.p_n.i == p_str{
return i-p_index}
next
return -1
//	引数の配列にCSVの配列化したものを代入
#modfunc get_array_at_CSV_task array r
sdim r,256,x,y
repeat x
i=cnt
repeat y
ii=cnt
r.i.ii=youso.i.ii
loop
loop
return

//	CSVの一行の数を数える
#modcfunc count2one_csv_at_CSV_task var oneL
//	変数block_num:一行の中の要素の数
block_num=1
before_index=0
//	数える一行の文字列分repeat
l=strlen(oneL)
repeat l
//	文字列の中から","を探して
after_index=instr(oneL,before_index,",")
//	文字列の中に","がないかぎり
if after_index!=-1{
//	要素に1加え
block_num++
//	indexに加算。","も一文字なので1加算
before_index+=after_index+1
}else{
//	文字列の中に","がないのでループ脱出
break
}
loop
return block_num

//	CSVの縦と横を数える
//	forNOTE:メモリノートパッド用
//	name:読み込むFILEの名前
//	r_x:CSVの横を数えてこれに代入
//	r_y:CSVの縦を数えてこれに代入
#modfunc count2csv_at_CSV_task var forNOTE,str name,var r_x,var r_y

//	メモリノートパッドにforNOTEを設定
notesel forNOTE
//	FILE名nameのFILEを読み込む
noteload name
//	r_yにFILEの行数を代入
r_y=notemax
n=1
//	FILEの行数繰り返す
repeat notemax
s=""
//	FILEのcnt行目を取り出す
noteget s,cnt
//	FILEのcnt行目を数えて
m=count2one_csv_at_CSV_task(thismod,s)
//	nより大きければ代入
if m>n:n=m
loop
r_x=n
return

//	一行のCSVを分割
//	p_str:分割する文字列
//	p_index:代入するmodule変数yousoの2次元目のindex
#modfunc my_split_at_CSV_task str p_str,int p_index
//	配列を確保して
sdim s_tmp,256,x
s=p_str
//	確保した配列に分割したものを代入
split s,",",s_tmp
repeat x
//	代入するmodule変数yousoのindex番目に代入
youso.cnt.p_index=s_tmp.cnt
loop
return

//	CSVのdump
#modfunc dump_at_CSV_task
repeat x
i=cnt
repeat y
ii=cnt
logmes ""+(i+1)+":"+(ii+1)+":"+youso.i.ii
loop
loop
return
#global

TEST用csvFILE
FILE名:F_CSV.csv
フルーツ,名前,甘さ
01,キウイ,1
02,りんご,2
03,ばなな,3

以下TESTコード
#include "FILE_CSV_task.hsp"

newmod my_csv,CSV_task,"F_CSV.csv"
mes get_x_at_CSV_task(my_csv)
mes get_y_at_CSV_task(my_csv)
mes get_array_x_at_CSV_task(my_csv)
mes get_array_y_at_CSV_task(my_csv)

mes get_one_youso_at_CSV_task(my_csv,-1,1)
mes get_one_youso_at_CSV_task(my_csv,0,1)
mes get_one_youso_at_CSV_task(my_csv,1,1)
mes get_one_youso_at_CSV_task(my_csv,2,1)
mes get_one_youso_at_CSV_task(my_csv,3,1)

mes get_one_youso_at_CSV_task(my_csv,1,-1)
mes get_one_youso_at_CSV_task(my_csv,1,0)
mes get_one_youso_at_CSV_task(my_csv,1,1)
mes get_one_youso_at_CSV_task(my_csv,1,2)
mes get_one_youso_at_CSV_task(my_csv,1,3)
mes get_one_youso_at_CSV_task(my_csv,1,4)

pos 100,0
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",1,0)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",1,2)
mes CSV_serch_x_at_CSV_task(my_csv,"バナナ",1,0)
mes ""
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",-1,0)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",0,0)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",1,0)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",2,0)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",3,0)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",4,0)
mes ""
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",1,-1)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",1,0)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",1,1)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",1,2)
mes CSV_serch_x_at_CSV_task(my_csv,"キウイ",1,3)
pos 200,0
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",1,0)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",1,1)
mes CSV_serch_y_at_CSV_task(my_csv,"甘さ",1,0)
mes ""
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",1,-1)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",1,0)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",1,1)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",1,2)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",1,3)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",1,4)
mes ""
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",-1,0)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",0,0)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",1,0)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",2,0)
mes CSV_serch_y_at_CSV_task(my_csv,"りんご",3,0)

pos 300,0
i=CSV_serch_x_at_CSV_task(my_csv,"名前",0,0)
ii=CSV_serch_y_at_CSV_task(my_csv,"02",0,0)
mes get_one_youso_at_CSV_task(my_csv,i,ii)