【C++】最強のSplitクラスを作ろう!【無いから】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/11/09(水) 00:22:13俺はVBやってちょっと使ってみただけなんだけど便利なんだよ。これ。
で、業務で使えるぐらい便利にならんかと色々と考えたわけよ。
んでも、俺って文字列処理あんまよく知らないし苦手なんだよね。
なんで、プログラム晒すと話が中々進まないから、
超便利なSplitクラスの仕様をみんなで考えようというわけよ。
はじめに何もないとアレだからとりあえず俺が考えたとk
0003デフォルトの名無しさん
2005/11/09(水) 00:26:370004デフォルトの名無しさん
2005/11/09(水) 00:27:37=======終了========
0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
2005/11/09(水) 00:32:27→【はい】 [いいえ]
0007デフォルトの名無しさん
2005/11/09(水) 00:32:48実はVBのもよく知らないんだけど、
boostのsplitの仕様ってどうなってんの?
0008デフォルトの名無しさん
2005/11/09(水) 00:40:12なんかあんまよさそうじゃないなぁ・・・。
とりあえずね。
1.デリミタ文字を指定できるようにしたい。
2.トークン3つ目の読み込みで処理を中断する等、指定したトークン数で途中で処理を止められるようにしたい。
3.指定した文字と文字の間にある文字列はデリミタの適用をぬけて取得できるようにしたい。
4.指定した文字列を発見したら、処理を中断するようにしたい。
5.中断したところから再開したい。
ぐらいは入れたいと思ってるんだけどどうだろうか?
1と3が実現すればCSVファイルぐらいは一発で読めると思う。
0009デフォルトの名無しさん
2005/11/09(水) 00:44:45どこでもやってるし。
0010デフォルトの名無しさん
2005/11/09(水) 00:48:15>どこでもやってるし
じゃあ、ソース頂戴。
俺、文字列処理得意じゃねぇんだ。
0011デフォルトの名無しさん
2005/11/09(水) 00:51:30コンパイラとか作ってる奴等の集まりなら
定石みたいのがたくさん転がってそうだけど。
英語読むのも、本読むのも、正直好きじゃねぇし。
しかも、そういう奴等と波長があわないらしく、人生において会ったことが無い。
0012デフォルトの名無しさん
2005/11/09(水) 00:55:04そこだけくださいってのもねぇ・・・
0013デフォルトの名無しさん
2005/11/09(水) 03:07:25boost::spiritすらいらない。
0014デフォルトの名無しさん
2005/11/09(水) 07:03:18見つけてきた。
http://www.kmonos.net/alang/boost/classes/regex.html
でも、これ>>8を実装するに当たっては役に立つかもしれないけど、
単体だとそれほど恩恵ないでしょ。
>>8の内容は全部同時にやってこそ意味があるんだよ。
0015デフォルトの名無しさん
2005/11/09(水) 07:38:14streamのメソッドとstringのメソッド両方使えば全部出来るだろうが。
0016デフォルトの名無しさん
2005/11/09(水) 07:51:25http://www.kmonos.net/alang/boost/classes/tokenizer.html
0017デフォルトの名無しさん
2005/11/09(水) 19:31:46適当に答えてねぇ?
>>8の内容を全部同時に満たせなきゃ駄目なんだよ。
わかってる?
CSVファイルなんかで、改行が入ってるとダブルコーテーションに囲まれてる文字列は
改行にデリミタ適用したくないでしょ?
それと一度に読むことしかできないと、文字列の途中でデリミタを変更したりとかできないでしょ?
そういうことよ。
0018デフォルトの名無しさん
2005/11/09(水) 19:36:33std::stringstreamやboost::tokenizerを内部的に使って、
>>8を満たすものを作るのは駄目か?
0019デフォルトの名無しさん
2005/11/09(水) 19:38:200020デフォルトの名無しさん
2005/11/09(水) 19:49:58数千人はいるだろ、国内だけでも。
俺が作ったオナニー言語にすら備わってるぞw
0021デフォルトの名無しさん
2005/11/09(水) 20:37:51作ってくださいってことなのに、
特定の用途にしか使えないクソ仕様ライブラリが欲しいって奴は、
そもそもC++使うなと。
アホな特定用途に特化したスクリプト言語や環境使ってシコシコ
してろ馬鹿。
0022デフォルトの名無しさん
2005/11/09(水) 21:51:14言語障害?
0023デフォルトの名無しさん
2005/11/10(木) 16:01:36どうせCSV以外に使わないんだから。
0024デフォルトの名無しさん
2005/11/10(木) 20:20:550025デフォルトの名無しさん
2005/11/10(木) 22:18:56できるとかレスつけてた奴って>>1よりレベル低いね。
0026デフォルトの名無しさん
2005/11/10(木) 22:46:07最低レベルの人間乙
0028デフォルトの名無しさん
2005/11/10(木) 22:55:14>>17 で行ってる途中でデリミタを変えるのは難しいかもしれないけど。
0029デフォルトの名無しさん
2005/11/10(木) 22:57:21カッコ内でかこまれた部分のデリミタの回避はどうやるの?
0030デフォルトの名無しさん
2005/11/10(木) 22:59:05escaped_list_separator のコンストラクタの第3引数
0031デフォルトの名無しさん
2005/11/10(木) 23:00:41tokenizerでできるんじゃないの?
0032デフォルトの名無しさん
2005/11/10(木) 23:02:36escaped_list_separator は tokenizer ライブラリの一部。
tokenizer の第1テンプレート引数に使う。
0033デフォルトの名無しさん
2005/11/10(木) 23:03:40ああ、突っ込むのね。
変なクラスの使い方してんなぁw
0034デフォルトの名無しさん
2005/11/10(木) 23:14:24これって中断と再開できんの?
0035デフォルトの名無しさん
2005/11/10(木) 23:25:32>>8の内容が全部できるなら、中断したときにデリミタを変更して再開すればできるんじゃないの?
なんでできないの?
0036マイク ◆yrBrqfF1Ew
2005/11/10(木) 23:57:30地球シュミレータで動かしている地球をシュミレーションするソフトを
なんとなく真似して開発してみるスレッドに変わったわけか。
0037デフォルトの名無しさん
2005/11/11(金) 01:19:40シュミレータって何?
0038デフォルトの名無しさん
2005/11/11(金) 08:05:310039デフォルトの名無しさん
2005/11/11(金) 18:56:40プログラマーには間違って欲しくないな。
0040デフォルトの名無しさん
2005/11/11(金) 19:21:20ミじゃないけどね
0041デフォルトの名無しさん
2005/11/11(金) 19:46:04はぁ?
0042デフォルトの名無しさん
2005/11/11(金) 19:54:050043デフォルトの名無しさん
2005/11/11(金) 19:55:44おまえら脳みその替わりに苺か薔薇でも詰まってるんじゃね?
0044デフォルトの名無しさん
2005/11/11(金) 21:05:510045デフォルトの名無しさん
2006/02/22(水) 03:05:100046デフォルトの名無しさん
2006/03/18(土) 09:16:260047デフォルトの名無しさん
2006/04/26(水) 06:47:57かなり前のレスだけど4と5ってどうやってやればいいの?
0048デフォルトの名無しさん
2006/04/26(水) 09:05:47リファレンスを流し読みしただけだが、イテレータ使えばいいだけだろ
0049デフォルトの名無しさん
2006/04/26(水) 14:45:450050デフォルトの名無しさん
2006/04/26(水) 14:53:190051デフォルトの名無しさん
2006/04/27(木) 00:22:32わからない。
どうやればいいの?
0052デフォルトの名無しさん
2006/04/27(木) 00:24:06>>8の1と3ができればCSVは楽に読めると思う。
0053デフォルトの名無しさん
2006/04/27(木) 11:51:23わからない。
どうやればいいの?
0054デフォルトの名無しさん
2006/11/02(木) 18:33:010055デフォルトの名無しさん
2006/11/03(金) 19:25:450056デフォルトの名無しさん
2006/11/09(木) 07:14:01できないと思われ。
0057デフォルトの名無しさん
2006/11/09(木) 07:16:170058デフォルトの名無しさん
2006/11/09(木) 16:33:430059デフォルトの名無しさん
2006/11/09(木) 17:10:32ドキュメントされていないのが嫌な感じではあるが。
0060デフォルトの名無しさん
2006/12/07(木) 01:21:50CSVの場合なら、
a = "abc,efg,hij,klm,n\0"な文字列を
a = "abc\0efg\0hij\0klm\0n\0"にするだけの話だろ?
変換過程で、変換した数を保持してやって、それぞれの文字列にアクセスするのは、
b = a
for( int i = 0 ; i<=(目的のトークン) ; i++ )
{
b = b + lstrlen( b ) + 1;
}
でアクセスできるじゃん
0061デフォルトの名無しさん
2006/12/07(木) 07:01:14誰もそんなこと聞いてネェよw
>>8の内容はboostの何使っても微妙なところで引っかかってできない。
繰り返しいうけど微妙なところで引っかかるの。
脳内だけでできると思わないほうがいい。
0062デフォルトの名無しさん
2006/12/07(木) 07:52:130063デフォルトの名無しさん
2006/12/07(木) 12:40:52a = "abc,efg,\"h,i\nj\",klm,n\0"を
a = "abc\0efg\0\"h,i\nj\"\0klm\0n\0"って事?
split( 変換する文字列, 区切り文字, 例外文字, 英数大文字小文字を区別するか )
見たいな関数を作って、例外文字から例外文字の間は変換作業を中止すればいいんじゃないの?
まあ、こうなってくると面倒くさくなるから、おいらなら、
split( 変換する文字列, 区切り文字列, 英数大文字小文字を区別するか )
にしておいて、読み込むデータをエクセルなんかで、","から"\t"に区切りを変更するけどね
0064デフォルトの名無しさん
2006/12/07(木) 22:02:52ttp://goodjob.boy.jp/chirashinoura/detail/id/100.html
0065デフォルトの名無しさん
2006/12/08(金) 00:33:43俺のやり方だと途中で中断してまた再開するってのができねぇ。
0066デフォルトの名無しさん
2006/12/08(金) 00:39:16そもそも中断っていってもどこで中断すればいいのか検討がつかない。
中断する位置によってはかなり変な動作をすることになるし。
この辺は実装するにあたっていい具合の仕様が見付からない。
また、指定された文字に閉じられた箇所はデリミタ無しってのが
一括で区切り文字を抜くことができなくてちょっと難しい。
そもそも、デリミタを途中でチェンジできる仕様みたいだから一括は全部駄目だけど。
中断する条件によってこの辺はかなり難しくなると思う。
0067デフォルトの名無しさん
2006/12/08(金) 00:43:11それじゃだめなのか?
0068デフォルトの名無しさん
2006/12/08(金) 00:49:39それってデリミタのチェンジいけんの?
0069デフォルトの名無しさん
2006/12/08(金) 00:56:30俺のやり方だと出来るとしか言いようがない。
boost::tokenizerならtoken_iterator使うだけで1,2,5はできるだろ。
>>8の3と4は関数オブジェクトを適当に書いてfilter_iteratorでtokenizerに渡せば解決。
0070デフォルトの名無しさん
2006/12/08(金) 01:01:18直接使えばなんとかなるはず。
…と思ったがescaped_list_separatorには外部からアクセスできない内部状態があるな。
「最後の要素が空でない」という条件下ではうまくいくけど、一般的には無理っぽい。
0071デフォルトの名無しさん
2006/12/08(金) 01:03:27それってそれぞれを別々にやる場合だけじゃない?
例えば中断したときにデリミタをチェンジして再開とかできんの?
あと、トークン3つめまではデリミタXX、その先の処理は、
文字列XXと○○で囲まれた文字へのデリミタ■■の適用を除外し、
枠外はデリミタ△△、■■でトークンを取得・・・とか。
007270
2006/12/08(金) 01:05:12泥臭いけど、できないことはないということで。
0073デフォルトの名無しさん
2006/12/08(金) 01:24:31>>59の通り、token_iterator<>::base()で元のイテレータ型で現在位置を示すイテレータが手に入るから、
別のtokenizerを作ってやるなりtokenizer::asign呼ぶなりで途中からの変更が可能。
0074デフォルトの名無しさん
2006/12/08(金) 01:25:25-asign
+assign
0075デフォルトの名無しさん
2006/12/08(金) 01:30:12a = "abc,efg,\"h,i\nj\",klm,n\0"を
a = "abc\0efg\0\"h\0i\nj\"\0klm\0n\0"にしてから
a = "abc\0efg\0\"h,i\nj\"\0klm\0n\0"にすればいいんじゃないのか?
0076デフォルトの名無しさん
2006/12/09(土) 01:26:59例えば↓のような文字列をトークン単位で分割できるか?
for(i=0;i<size;i++){unko("うんこ?\"Yes/No\"");}
結果は
for ( i = 0 ; i < size ; i + + ) { unko ( " うんこ? "Yes/No" " ) ; }
って感じになるようにしたい。
(tokenizerはなんか俺のしたかったことがことごとく
できないような気がしたんだが今となってはなんでできなかったのか正直忘れてしまったぜw
ただ、俺がアフォだったからじゃなくて、なんかの機能がなくてできなかった気がするぜw)
0077デフォルトの名無しさん
2006/12/09(土) 01:54:39boost::spiritでも使いなされ。
0078デフォルトの名無しさん
2006/12/09(土) 05:25:22なんか、>>1で言ってるのと全然違うもんじゃないですか...
そう言う形でと言うのなら、検索の仕方から全然違う物になると思いますよ
単純に、","であるとか"\r\n"であるとか、"<BR>"であるとかを句切り符号にして区切るようなルーチンであれば、対象の先頭から何も考えず調べればいいけれど
その場合だと、半角記号(空白含むダブルクォーテーション除く)と一致するかどうかを調べる方が早いと思うのですが...
for(i=0;i<size;i++){unko("うんこ?\"Yes/No\"");}
この場合だと、
'(' ')' ';' '<' '+' '{' '}'
と一致する文字を探すルーチンを作る方が簡単ではないでしょうか?
この場合、単純な1文字の検索なんで、検索の工夫といっても限られるとは思いますが...
0079デフォルトの名無しさん
2006/12/09(土) 06:55:39なるほど。
そこまでいくとパーサジェネレータみたいなの作ったほうが早いのか・・・。
結局、どこまでサポートするか?
って話になるのか。
でも、あんまり厳密なのもいらないし、特に演算子みたいなのも気にする必要もないから
パーサジェネレータまでは必要ないなぁ。
>その場合だと、半角記号(空白含むダブルクォーテーション除く)と一致するかどうかを調べる方が早いと思うのですが...
>for(i=0;i<size;i++){unko("うんこ?\"Yes/No\"");}
>この場合だと、 '(' ')' ';' '<' '+' '{' '}'
例えばこれも { と ( を区切り(+トークン)として認識出来さえすればはじめの一発目で
for ( i=0;i<size;i++ ) { unko ( "うんこ?\"Yes/No\"" ) ; }
ここまでもってこれちゃうからこの辺の幅を捨てるのは惜しいと思うんだよね。
0080デフォルトの名無しさん
2006/12/10(日) 01:16:110081デフォルトの名無しさん
2006/12/14(木) 16:40:350082デフォルトの名無しさん
2006/12/26(火) 02:47:06というか、作るスキルないから、boost流用って流れになってるのか?
0083デフォルトの名無しさん
2006/12/26(火) 14:30:330084デフォルトの名無しさん
2007/04/18(水) 22:03:15■ このスレッドは過去ログ倉庫に格納されています