Q&A

  • 구분자로 문자열 분리하기
문자열을 ',' 구분자를 이용하여 분리하려고 합니다.

제가 작성한 소스입니다.
var
TempList : TStringList;
LCnt : Integer;
begin
Result := False;
TempList := TStringList.Create;

for LCnt := 0 to StrList1.Count - 1 do
   begin
     TempList.Clear;
     ExtractStrings( [','], [], PAnsiChar(StrList1.Strings[LCnt]), TempList );
     ShowMessage(TempList[0] + ' : ' + TempList[1]);
   end;
TempList.Free;
end;

데이터 1 : AA 1,BB 1
데이터 2 : AA 2,BB 2
데이터 3 : AA 3,
데이터 4 : AA 4,
데이터 5 : AA 5,BB 5

결과 : 데이터 1, 2는 제대로 분리가 되는데,
      데이터 3에서 두번째 인덱스가 null이라서
      TempList[1]에서 인덱스 오류가 발생합니다.
      null값을 제어할 방법이 없을까요?

다른 방법으로
//  TempList.Delimiter := ',';
//  TempList.DelimitedText := StrList1.Strings[LCnt];
//  또는
//  TempList.CommaText := StrList1.Strings[LCnt];
이것을 사용하면, 데이터 중간에 공백이 있으면, 공백 이후는 무시가 됩니다.
6  COMMENTS
  • Profile
    최성준 2006.09.07 08:26
    http://www.delphi.co.kr/zboard/view.php?id=tips&page=1&sn1=on&divpage=1&sn=on&ss=off&sc=off&keyword=최성준&select_arrange=headnum&desc=asc&no=1306
  • Profile
    cubezero 2006.09.03 07:37
    http://delphi.about.com 에 관련 팁이 있어서 올립니다.

    procedure StringParseDelimited(StrList : TStrings; Value, Delimiter : String);
    var
    dx : Integer;
    ns : String;
    txt : String;
    delta : Integer;
    begin
    delta := Length( Delimiter );
    txt  := Value + Delimiter;

    StrList.BeginUpdate;
    StrList.Clear;

    try
    while Length( txt ) > 0 do
      begin
       dx := Pos( Delimiter , txt );
       ns  := Copy( txt , 0 , dx-1 );
       StrList.Add( ns );
       txt :=  Copy( txt , dx+delta , MaxInt );
      end;
    finally
    StrList.EndUpdate;
    end;
    end;

    사용방법 : StringParseDelimited(StringList, 원본데이터, 구분자);
  • Profile
    이영주 2006.09.05 10:35
    뭐 굳이 딴지를 걸자는 것은 아니지만
    pos, copy 함수를 쓰면서 StringList 까지 쓰는 이유를 모르겠군요.
    마치 일부러 코드를 복잡하게 만들었다는 생각이 드는것은 왜 일까요?
    제 생각이 틀렸는지...

  • Profile
    cubezero 2006.09.06 02:26


    더 좋은 방법이 있으면 올려주세요.
    소스코드는 최적화가 필요한 부분이니까요...
  • Profile
    둘리 2006.09.03 00:23
    StrList1변수에 검색될 string이 어떻게 적재되는지 몰라서
    원하시는 답이 아닐것 같지만 적어봅니다

    어렵지 않은 방법은 StrList1변수에 string이 적재될때
    끝에다 빈 string하나 즉 ' ' 이걸 추가하시면 됩니다.
    StrList1.Add(적재되어야할 문자열 +' '); 이렇게요

    근데 이렇게 하실 수 있는 상황인지는 알수가 없어서...  __;

    도움이 되었으면 합니다.
    즐코하세요.



  • Profile
    cubezero 2006.09.03 07:42

    답변에 감사드립니다.
    저도 둘리님 같이 뒤에 ' '를 추가하면 인덱스 에러는 발생하지 않지만,
    실제 데이터가 들어있지 않은 필드에도 ' '가 들어가는 현상이 발생됩니다.

    http://delphi.about.com 에 문자열 파싱과 관련한 함수가 있어서 올렸습니다.