Q&A

  • TXT파일의 데이터를 DB로 저장하는 순서? 흐름?에 대해 질문드려요.

텍스트파일 안에 있는 데이터가

윤영훈 | 27 | 남 | 178 |
강수경 | 24 | 여 | 168 |
김현중 | 27 | 남 | 176 |
이제현 | 27 | 남 | 170 |
강희정 | 25 | 여 | 158 |
....

요런식으로 있는 상태에서

파일불러오기
-> 텍스트라인수까지 while루프
-> 라인하나씩 불러오기 (Readln같은걸로..)
-> For루프로 한글자씩 읽어오기
-> 구분자로 사용된 '|' 을 만나면 한글자씩 읽어오며 저장했던 글자를 테이블에 필드변로 저장.
    (저는 AdvStringGrid쓰고 있습니다)
-> For루프 종료
-> while루프 종료.

-> 테이블 총 레코드 수까지 while루프
-> Insert into로 필드별로 레코드값입력
-> while 종료.

이렇게 하는 게 맞는 순서인가요?

검색을 해서 코드는 몇가지 봤는데,
전체적인 흐름에 대한 설명은 드물어서... 궁금해서 질문올립니다.

2  COMMENTS
  • Profile
    최용일 2009.07.09 08:37
    뭐... 정석적인 방법이지만...
    텍스트파일이라면 파일에서 라인별로 읽어와서 파싱하는것 보다는 TStringList를 쓰시면 좀 더 편하게 코딩하실 수 있을것 같네요...
    파싱은 ExtractStrings 이란 함수를 이용하시면 편하구요...

    var
    Source, LineData: TStringList;
    Index: Integer;
    begin
    Source := TStringList.Create;
    LineData := TStringList.Create;
    try
    Source.LoadFromFile(텍스트파일풀패스);
    for Index := 0 to Source.Count - 1 do
    begin
    LineData.Clear;
    ExtractStrings([' | '], [''], Source[Index], LineData);
    // LineData[0] = 윤영훈
    // LineData[1] = 27
    // LineData[2] = 남
    // LineData[3] = 178
    DB에저장하거나 화면에 보여주기;
    end;
    finally
    Source.Free;
    LineData.Free;
    end;
    end;
  • Profile
    윤영훈 2009.07.10 02:03
    답변 감사합니다~ 완전 일일이 노가다로 할 뻔 했는데, StringList를 써서 편하게 할 수 있었어요.
    음... 혹시라도 다른 분들도 참조할 수 있게 제가 수정해서 사용한 것도 적어보겠습니다.

    0.
    먼저 텍스트파일풀패스를 설정하는 곳입니다.

    Source.LoadFromFile(Edit1.Text);

    저는 OpenDialog를 띄워서 Edit컨트롤에 경로를 박아서 가져오게했죠.

    1.
    ExtractStrings([' | '], [''], Source[Index], LineData);
    요고의 경우 세번째 인자가 형식에 맞지 않는다는 에러가 나오길래
    ExtractStrings(['|'], [], PChar(Source.Strings[Index]), LineData);
    요렇게 사용했습니다. 하다보니 중간에 ['']도 []로 바꿨었네요.

    2.
    DB를 저장하거나 화면에 보여주기 <- 요부분은 DB에 저장하는 걸로 했습니다.

    with ZQuery1 do
    try
    Close;
    SQL.Clear;
    SQL.Add('Insert into DBUpdateTest');
    SQL.Add('Values (:Name, :Age, :Sex, :Height)');
    ParamByName('Name').AsString:= LineData[0];
    ParamByName('Age').AsInteger:= StrToInt(LineData[1]);
    ParamByName('Sex').AsString:= LineData[2];
    ParamByName('Height').AsInteger:= StrToInt(LineData[3]);
    ExecSQL;
    finally
    end;

    파이어버드를 사용하고 있는데 Age필드와 Height필드는 Integer형식이라서 StrToInt로 형변환하였습니다.
    Date형식의 필드는 StrToDate(LineData[인덱스]) 요렇게 하니까 에러없이 DB에 입력되는 것도 확인해봤습니다.

    도움주셔서 다시한번 감사드립니다.