Q&A

  • 최영일님이 만드신 ExtractStringsWithNull함수 말인데요...
문자열을 자를 때 null값을 무시하지 않는 방법을 찾고 있었습니다.

마침 똑같은 질문에 영일님이 답변들 달아주셨더군요.

그런데 이 함수가

a`b`c`d  `<- 문자를 구분자로 할 땐 잘 동작하지만

a``b``c``d  ``<- 같은 문자 두개를 구분자로 할 경우

a, ,b, ,c, ,d  이런식으로 `<-개를 구분자로 인식해 버리더군요.

이걸 해결할 방법이 없을까요?


function TForm1.ExtractStringsWithNull(Separators, WhiteSpace: TSysCharSet; Content: PChar;
  Strings: TStrings): Integer;
var
  Head, Tail: PChar;
  EOS, InQuote: Boolean;
  QuoteChar: Char;
  Item: string;
begin
  Result := 0;
  if (Content = nil) or (Content^=#0) or (Strings = nil) then Exit;
  Tail := Content;
  InQuote := False;
  QuoteChar := #0;
  Strings.BeginUpdate;
  try
    repeat
      while Tail^ in WhiteSpace + [#13, #10] do
        Inc(Tail);
      Head := Tail;
      while True do
      begin
        while (InQuote and not (Tail^ in ['''', '"', #0])) or
          not (Tail^ in Separators + [#0, #13, #10, '''', '"']) do
          Inc(Tail);
        if Tail^ in ['''', '"'] then
        begin
          if (QuoteChar <> #0) and (QuoteChar = Tail^) then
            QuoteChar := #0
          else QuoteChar := Tail^;
          InQuote := QuoteChar <> #0;
          Inc(Tail);
        end else Break;
      end;
      EOS := Tail^ = #0;
//      if (Head <> Tail) and (Head^ <> #0) then           <-ExtractString함수에서 이부분을 수정...
      begin
        if Strings <> nil then
        begin
          SetString(Item, Head, Tail - Head);
          Strings.Add(Item);
        end;
        Inc(Result);
      end;
      Inc(Tail);
    until EOS;
  finally
    Strings.EndUpdate;
  end;
end;

0  COMMENTS