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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1030
FGCSV カンマ区切りのデータの読み込みについて9解決


FG

リンク

2015/10/30(Fri) 21:19:42|NO.72633

CSVのカンマ区切りのデータの読み込みの際に、

CSVデータの文字列の中にカンマなどがある場合にはどのように処理すればいいのでしょうか?

読み込みはnoteloadで行っております。

例1

a="\"10,000\",\"100\""
などの場合



また、

例2
a=100,000,100


例2に関しては実際には"100,000"と"100"
のデータなのに、noteloadで読み込んだ際には上記のようなデータになってしまい
splitなどの命令での分割ができません。
なにかいい方法をありますか?
ご教授お願いします。



この記事に返信する


KA

リンク

2015/10/31(Sat) 06:23:47|NO.72643

>>a="\"10,000\",\"100\""
CSVの仕様外の文字列です。

"100,000","100"

というデータに成るはずです。



沢渡

リンク

2015/10/31(Sat) 09:40:35|NO.72644

CSVではカンマはデータ区切りのために使うものですから、それ以外の用途でカンマを使ってしまうと、当然動作に支障をきたします。
「データ区切り以外のカンマは別な記号(たとえば@とか)に置き換えておき、splitで分割後、カンマに置き換える」
という方法では問題あるでしょうか?
もしくは、「数値を3桁ずつ区切る」等、カンマの使い方に規則性がある場合は、splitで分割後にカンマを追加するという手もあります。



FG

リンク

2015/10/31(Sat) 10:02:22|NO.72645

ご連絡ありがとうございます。
KAさま

その通りです。申し訳ございません。

沢渡さま

区切りカンマと普通のカンマを見分ける方法などはあるのでしょうか?



沢渡

リンク

2015/10/31(Sat) 10:47:10|NO.72646

見分ける方法は、たぶん無いと思います。少なくとも私には思い浮かびません。
他に、「データ区切りには、カンマではない、別の記号を使う」という方法や、
「データ区切りにカンマを使わず、改行コードだけを使う」
「データ区切り以外のカンマは、半角カンマではなく全角カンマにする」
という手もあります。



たんす

リンク

2015/10/31(Sat) 10:48:38|NO.72647

例1は区切り位置がはっきりしているので処理可能です。

a="\"10,000\",\"100\",\"123,456.789\"" mes "元データ\n"+a mes "\n☆配列に変換" b="" split a,"\",\"",b //「","」で分割 foreach b strrep b(cnt),"\"",""//分割に使わない部分の「"」を除去 mes strf("分割結果%d:%s",cnt,b(cnt)) wait 0 loop mes "\n☆ノート形式に変換" c=a strrep c,"\",\"","\n"//「","」を改行に strrep c,"\"","" //残りの「"」を削除 mes ">>変換後\n"+c

例2は、区切り位置が特定できないので難しいですね。



暇人

リンク

2015/10/31(Sat) 10:54:06|NO.72648

例1の方

a="\"10,000\",\"100\"" //テキストファイル上では "10,000","100" (必ず""で囲われてる) strrep a,"\",\"","\"#\"" //文字列 "," を "#" に置き換え(""も検索置き換え文字列として指定) split a,"#",a_split repeat stat mes a_split(cnt) loop
例2の方はデータに法則を作るか何らかの形でテキストの方にデータの区切りを与えないと無理
なにでCSVを書き出してるか分からないが、100,000が100000を表してるなら
例2は保存時に"100,000",100か100000,100にするか選べない?

で、データとして使う場合普通は100000,100形式で保存して
読み込んで表示する側でカンマを付け足す。


"100,000",100 形式で保存した場合の方法

a="\"10,000\",100,\"100\",,,0,\"12,345\",222,333" //テキストファイル上で""有りと無しの混合データの分割 mes a+" これを分割" sdim a_split total_index=0 a_line=0 repeat index=instr(a,total_index,"\"") if index<0 { a_split(a_line)=strmid(a,total_index,strlen(a)-total_index) split a_split(a_line),",",a_split_temp repeat stat a_split(a_line)=a_split_temp(cnt) a_line++ loop break }else{ if index ! 0 { a_split(a_line)=strmid(a,total_index,index-1) split a_split(a_line),",",a_split_temp repeat stat a_split(a_line)=a_split_temp(cnt) a_line++ loop } total_index+index index=instr(a,total_index+1,"\"") a_split(a_line)=strmid(a,total_index,index+2) a_line++ total_index+index+3 } loop repeat a_line mes a_split(cnt) loop



FG

リンク

2015/10/31(Sat) 11:24:06|NO.72649

沢渡さま
ありがとうございます

たんすさま
サンプルまで提示いただきありがとうございます。
一度、例2に関しては対処方法を考えてみたいと思います

暇人様

サンプルの提示ありがとうございます。
保存時に上記の方法で保存するようにしてみます。

素早い回答感謝致します。
またなにかございましたら質問させていただきます。



GENKI

リンク

2015/10/31(Sat) 13:55:51|NO.72651

なんだか懐かしい話題…。

ダブルクォーテーションで囲まれたカンマは無視して、csvとして読み込みたいってことでしょうか。
Excelが出力するcsvとかがそういう仕様ですね。
csvフォーマットとしては亜種になるようですけども。

HSP開発wiki String/CSV形式データの読み込み
http://wiki.hsp.moe/String%EF%BC%8FCSV%E5%BD%A2%E5%BC%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF.html

こんなのでどうでしょうか。
strrep命令が実装される前に作ったらしく、strrepを使っちゃってるので別の文字列に置き換えて使ってください。



暇人

リンク

2015/11/3(Tue) 06:10:38|NO.72716

NO.72648にちょっと問題があった
>"100,000",100 形式で保存した場合の方法
最後のデータにも"が有った時にa_lineが一つ増える

>repeat
の前後を

strlen_max=strlen(a) repeat if total_index>=strlen_max {break}
のように追加修正

改行には対応してないのでnoteget等で一行毎に処理する必要がある



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