開発wikiでCSVモジュールがありますが
一行単位なのでまとめて読み込むモジュールがあると
便利かな?と思ったので書きました
特殊文字は特殊文字を展開するモジュールの完成待ち
FILE名:FILE_CSV_task.hsp
TEST用csvFILE
FILE名:F_CSV.csv
以下TESTコード
一行単位なのでまとめて読み込むモジュールがあると
便利かな?と思ったので書きました
特殊文字は特殊文字を展開するモジュールの完成待ち
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) |