システム開発・Webサイト構築 プラスラス

2007/8/12 日曜日

【BCB】AnsiStringをデリミタ(区切り文字)で分割する

このエントリーを含むはてなブックマーク クリップ! Yahoo!ブックマークに登録 Buzzurlにブックマーク Google ブックマーク del.icio.us

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;
       }
   }
}

Filed under: C++,C++ Builder,Programming — Nakai @ 8:19:35

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.776 sec. Powered by WordPress