開発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) |