【BCB】AnsiStringをデリミタ(区切り文字)で分割する
C++ Builderで、AnsiString型の文字列をスペースやカンマなどのデリミタ(区切り文字列)で分割する方法です。
カンマ区切りの場合
カンマ区切りのテキストをカンマで分割する場合は、元々TStringListにそういう機能があるので簡単です。
CommaTextにカンマ区切りの文字列を与えることによって、TStringListの要素に分割した文字列がセットされます。
//カンマ区切りの文字列 AnsiString csvText = "aaa,bbb,ccc"; //結果格納用のTStringListを用意 TStringList* splittedResult = new TStringList(); //CommaTextプロパティにセット spplitedResult->CommaText = csvText; // //何らかの処理 // //spplitedResultは使い終わったら解放 delete spplitedResult;
CommaTextに分割したい文字列をセットした段階でsplittedResultに分割された文字列が入った状態になります。
カンマ区切り以外の場合
しかし、カンマ以外の区切り文字で文字列を分割する関数等は、VCLには無いようです。
自分で以下のような関数を用意しておくと便利です。
void YourClassName::Split( const AnsiString& target, //対象の文字列 const AnsiString& delimit, //区切り文字 TStringList& splittedResult //結果格納用 ) { //先頭位置 int iHead = 1; //分割対象全体の長さ int iTargetLen = target.Length(); //デリミタの長さ int iDeliLen = delimit.Length(); while(iHead <= iTargetLen) { //まだ試していない部分の文字列を取得 AnsiString restPart = target.SubString(iHead, iTargetLen - iHead + 1); //最初に現れるデリミタの位置を取得 int iDeliPos = restPart.AnsiPos(delimit); if(iDeliPos == 0) { //デリミタは見つからなかった splittedResult.Add(restPart); break; } else { if(iDeliPos != 1 && iDeliPos != restPart.Length()) { //一文字目がデリミタだったり、 //最後がデリミタだった場合は無視する //それ以外の場合は、 //先頭からデリミタの一文字前までを //TStringListに追加する AnsiString splittedPart = target.SubString(iHead, iDeliPos - 1); splittedResult.Add(splittedPart); } //先頭位置を更新 iHead += iDeliPos + iDeliLen - 1; } } }
TrackBack URL :
Comments (0)