Q&A

  • csv 파일에서 각각의 필드를 읽어 Array에 저장하는 방법
안녕하세요, 고수님들. 요즘은 거의 매일 여기 오다시피 하는군요.
오늘은 아주 급한 질문이 있어 왔습니다.

csv 파일에서 각각의 필드값을 한번에 읽어 Array 에 저장하는 방법좀 가르쳐 주세요. copy기능을 사용해서 한자씩 콤마와 비교해서 저장했더니, 너무 많은 시간이 걸리는군요. 고수님들 꼭좀 부탁드립니다.
5  COMMENTS
  • Profile
    Seung Hun Lee 2002.04.18 21:56
    최용일님...정말 죄송하네요...
    한가지 풀면 또 다른 문제가 생기는데요....

    최용일님이 가르쳐 준데로 했더니...정말 완변하고 빠르게 데이타가 다 입력이 됬는데요, 한가지 문제는 필드값이 Null일경우가 문제가 생기는데요.

    가령, 일정한 Array 를 항상 불러서 저장해야 되는데,

    ExtractStrings([','],[' '], PChar(TmpStr), MyRecordArray);
    를 사용했더니 Null 값이 들어있는 필드는 무시되고 다음 값이 Array 에 저장 됩니다.. 어떻게 이문제를 풀어야 되는지 답변 부탁드리겠습니다......
  • Profile
    최용일 2002.04.19 01:08
    ExtractStrings에서 널체크하는 부분만 지우고 쓰시면 되겠네요...

    ExtractStrings대신에 아래 함수를 쓰세요...

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

    ^^ 항상 즐코하세요...

  • Profile
    최용일 2002.04.18 18:30
    안녕하세요. 최용일입니다.

    ExtractStrings를 이용해보세요...

    var
        S: string;
        StrList: TStringList;
    begin
        S := '1,2,3,4,5,6,7,8,9,0';
        StrList := TStringList.Create;
        ExtractStrings([','], [' '], PChar(S), StrList);

        // StrList.Items배열에 들어 있으니까 잘 사용하세요...
        for I := 0 to StrList.Count - 1 do
            ShowMessage(StrList.Items[I]);

        StrList.Free;
    end;

    ^^ 항상 즐코하세요...

  • Profile
    Seung Hun Lee 2002.04.18 22:39
    감사요, 최용일님....

    근데요, 제가 넘 초보라....
    ExtractStrings([','], [' '], PChar(S), StrList);
    여기서 [','], [' '] 각각 뭘 의미하는지 갈쳐주십사하고요..... ^^:

  • Profile
    최용일 2002.04.19 00:13
    첨거는 구분자로 CSV를 파싱하는데 쓰고,

    그 다음거는 공백입니다.