Q&A

  • 꼭좀 답변부탁드립니다. 이번에는 소스도 같이 올려습니다.
텍스트(txt) 화일을 읽어서 db에 저장할려고 합니다.

현재 txt 화일에는

1|M110600823|최수현|2|M110600026|이병희|3|M110601823|김래선|4|M110601825|최충섭|5|M110601827|95050612|6|M110601828|손준태|7|M110601830|성학선|

이런 식으로 자료가 들어가 있습니다.

어떻게 레코드단위로(번호,코드,이름)끊어서 불려들여 DB에

각 필드별로 저장할수 있을까요?



아래예제식으로..

ex)1|M110600823|최수현|

불러서 db에 저장할수 있을까요?



방법좀 알려주세요

아래에 제가 한 소스를 올립니다.

제가 만드 소스에는 문제가 buffer단위로 txt화일을 읽어드려서..

고정적인 데이터만 가지고 올수있습니다.

가변적인 데이터는 문제가 심각하던군요

위에서와 같은 txt 화일은 문제가 심각합니다.

방법좀 알려주세요?

꼭 부탁드립니다.



unit load;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;



type

TForm1 = class(TForm)

Button1: TButton;

Memo1: TMemo;

OpenDialog1: TOpenDialog;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);

var

fh1,iCount : Integer;

Buffer : array[1..20] of char;

begin

if OpenDialog1.Execute then

begin

fh1 := fileOpen(OpenDialog1.Filename,fmshareDenyWrite);

iCount := FileRead(fh1,Buffer, Sizeof(Buffer));



{ memo1.lines.add(IntToStr(iCount));

memo1.lines.add(Buffer);}

while iCount <> 0 do

begin

memo1.lines.add(Buffer);

iCount := FileRead(fh1,Buffer, Sizeof(Buffer));

end;

end;



end;



end.



3  COMMENTS
  • Profile
    김양우 2001.05.16 03:21
    제가 한번 구현해 봤습니다.



    // 메인루틴

    1. 화일을 연다

    2. while (화일의 끝이 아니면)

    begin

    2.1 화일에서 문자열을 읽어서 버퍼에 추가한다

    2.2 while (읽기 스위치가 꺼져있으면)

    begin

    2.2.1 버퍼에서 한레코드의 필드를 추출한다 (uf_field_divide_proc

    2.2.2 추출한 필드를 등록한다.

    end;

    end;

    3. 화일을 닫는다.





    // 구현내용





    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls;

    const

    C_FIELD_CNT = 3; // 필드의 갯수

    C_READ_SIZE = 50; // 한번 읽을 문자수

    type

    TMyStrArray = Array [1..C_FIELD_CNT] of string; // 필드를 분리 시킨 후 넘길 배열

    TForm1 = class(TForm)

    Button1: TButton;

    OpenDialog1: TOpenDialog;

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    // 버퍼에서 필드갯수만큼 읽어서 필드를 분리시킨다

    function uf_field_divide_proc(var ps_buffer:string;

    const pi_field_cnt :integer;

    var ps_fields :TMyStrArray):boolean;



    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}

    // 1 2

    //12345678901234567890

    //1|M110600823|최수현|

    //2|M110600026|이병희|

    //3|M110601823|김래선|

    //4|M110601825|최충섭|

    //5|M110601827|95050612|

    //6|M110601828|손준태|

    //7|M110601830|성학선|



    function TForm1.uf_field_divide_proc(var ps_buffer:string;

    const pi_field_cnt :integer;

    var ps_fields :TMyStrArray):boolean;

    var i, li_idx:integer;

    begin

    // 필드의 갯수만큼 반복

    for i := 1 to pi_field_cnt do

    begin

    li_idx := Pos('|', ps_buffer);

    if li_idx > 0 then

    begin

    ps_fields[i] := copy(ps_buffer, 1, li_idx - 1); // 버퍼에서 필드 복사

    system.delete(ps_buffer,1, li_idx); // 필드 복사후 버퍼를 삭제

    end else

    begin

    Result := True; // 읽기 스위치를 켜두고 루틴을 빠져나감

    exit;

    end;

    end;

    Result := False; // 읽기 스위치를 꺼둠

    end;





    procedure TForm1.Button1Click(Sender: TObject);

    var

    F: TextFile;



    li_read_cnt : Integer;

    Buffer : string;

    ls_str : string;

    lb_read_req : Boolean;

    ls_fields : TMyStrArray;

    begin

    if not OpenDialog1.Execute then exit;

    try

    AssignFile(F, OpenDialog1.FileName); { File selected in dialog box }

    Reset(F);

    Buffer := '';

    li_read_cnt := C_READ_SIZE; // 화일루프에 들어가기 위해서 초기값을 줌

    lb_read_req := True; // 버퍼에 화일의 내용을 읽어오라는 스위치

    while not SeekEof(f) do

    begin

    if lb_read_req then

    begin

    Read(F, ls_str); // 문자열을 읽어옴

    Buffer := Buffer + ls_str; // 읽어온 문자열을 버퍼 뒤에 붙임

    lb_read_req := False; // 읽어온 뒤는 읽기 스위치를 꺼둠

    end;

    while not lb_read_req do // 읽기 스위치가 꺼져있으면

    begin

    // 버퍼에서 한 레코드 필드를 추출한다

    lb_read_req := uf_field_divide_proc(Buffer, C_FIELD_CNT, ls_fields);

    // uf_insert_proc(ls_fields); <= 여기에 추출해온 레코드를 등록하는 루틴을 넣으면 됩니다.

    end;

    end;

    finally

    CloseFile(F);



    end;



    end;



  • Profile
    망치 2001.05.16 02:21
    김아성 wrote:

    > 텍스트(txt) 화일을 읽어서 db에 저장할려고 합니다.

    > 현재 txt 화일에는

    > 1|M110600823|최수현|2|M110600026|이병희|3|M110601823|김래선|4|M110601825|최충섭|5|M110601827|95050612|6|M110601828|손준태|7|M110601830|성학선|

    > 이런 식으로 자료가 들어가 있습니다.

    > 어떻게 레코드단위로(번호,코드,이름)끊어서 불려들여 DB에

    > 각 필드별로 저장할수 있을까요?

    >

    > 아래예제식으로..

    > ex)1|M110600823|최수현|

    > 불러서 db에 저장할수 있을까요?

    >

    > 방법좀 알려주세요

    > 아래에 제가 한 소스를 올립니다.

    > 제가 만드 소스에는 문제가 buffer단위로 txt화일을 읽어드려서..

    > 고정적인 데이터만 가지고 올수있습니다.

    > 가변적인 데이터는 문제가 심각하던군요

    > 위에서와 같은 txt 화일은 문제가 심각합니다.

    > 방법좀 알려주세요?

    > 꼭 부탁드립니다.

    >

    > unit load;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls;

    >

    > type

    > TForm1 = class(TForm)

    > Button1: TButton;

    > Memo1: TMemo;

    > OpenDialog1: TOpenDialog;

    > procedure Button1Click(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > fh1,iCount : Integer;

    > Buffer : array[1..20] of char;

    > begin

    > if OpenDialog1.Execute then

    > begin

    > fh1 := fileOpen(OpenDialog1.Filename,fmshareDenyWrite);

    > iCount := FileRead(fh1,Buffer, Sizeof(Buffer));

    >

    > { memo1.lines.add(IntToStr(iCount));

    > memo1.lines.add(Buffer);}

    > while iCount <> 0 do

    > begin

    > memo1.lines.add(Buffer);

    > iCount := FileRead(fh1,Buffer, Sizeof(Buffer));

    > end;

    > end;

    >

    > end;

    >

    > end.

    >





    제가 사용한 방법인데 이방법은 한라인당 일정한 데이타가 들오올경우라서

    맞을지 모르겠네요..



    procedure TForm_2041200.Text_load;

    var

    text_data : TStringList;

    text_cnt , i : integer;

    begin



    // File Read후 그리드에 자료 Move

    text_data := TStringList.Create;

    text_data.LoadFromFile('c:text1.txt');

    text_cnt := text_data.Count;

    for i:=0 to text_cnt-1 do

    begin

    text1.txt := Copy(text_data.Strings[i],1,1);

    text2.txt := Copy(text_data.Strings[i],2,10);

    end;

    end;



    대충 이런식으로 했는데...

    구분자로 처리하실거면 한글자씩잃어 특정 구분자 전까지 읽어 사용하시던지

    pos를 사용해 일정 데이타 까지 자르시던지 하시면 될거 같은데요..



  • Profile
    하기 2001.05.16 01:20
    한줄로 쭉~~~ 붙어 있다면... Cutting하기가 좀 애매 하군요... 그럼...Pos함수를 써서

    해보세요...

    그럼... 쉽게 분리 할 수 있을것 같은데요... 그럼...



    김아성 wrote:

    > 텍스트(txt) 화일을 읽어서 db에 저장할려고 합니다.

    > 현재 txt 화일에는

    > 1|M110600823|최수현|2|M110600026|이병희|3|M110601823|김래선|4|M110601825|최충섭|5|M110601827|95050612|6|M110601828|손준태|7|M110601830|성학선|

    > 이런 식으로 자료가 들어가 있습니다.

    > 어떻게 레코드단위로(번호,코드,이름)끊어서 불려들여 DB에

    > 각 필드별로 저장할수 있을까요?

    >

    > 아래예제식으로..

    > ex)1|M110600823|최수현|

    > 불러서 db에 저장할수 있을까요?

    >

    > 방법좀 알려주세요

    > 아래에 제가 한 소스를 올립니다.

    > 제가 만드 소스에는 문제가 buffer단위로 txt화일을 읽어드려서..

    > 고정적인 데이터만 가지고 올수있습니다.

    > 가변적인 데이터는 문제가 심각하던군요

    > 위에서와 같은 txt 화일은 문제가 심각합니다.

    > 방법좀 알려주세요?

    > 꼭 부탁드립니다.

    >

    > unit load;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls;

    >

    > type

    > TForm1 = class(TForm)

    > Button1: TButton;

    > Memo1: TMemo;

    > OpenDialog1: TOpenDialog;

    > procedure Button1Click(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > fh1,iCount : Integer;

    > Buffer : array[1..20] of char;

    > begin

    > if OpenDialog1.Execute then

    > begin

    > fh1 := fileOpen(OpenDialog1.Filename,fmshareDenyWrite);

    > iCount := FileRead(fh1,Buffer, Sizeof(Buffer));

    >

    > { memo1.lines.add(IntToStr(iCount));

    > memo1.lines.add(Buffer);}

    > while iCount <> 0 do

    > begin

    > memo1.lines.add(Buffer);

    > iCount := FileRead(fh1,Buffer, Sizeof(Buffer));

    > end;

    > end;

    >

    > end;

    >

    > end.

    >

    • 이명교
    • 2001.05.16 23:33
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 미키
      2001.05.17 03:39
      dbgrid의 align을 none 으로 하고 dbgrid을 폼 보다 좀 크가 해 보세요 폼의 borderStyle을 물론 size...
    • 블랙봉
      2001.05.16 07:02
      명지니 wrote: > 허거... 왜이리 찾기 힘든지 ^^; > 지금 DBase를 로컬DB로 사용해서 프로그램 하는데요 ...
    • 명지니
      2001.05.16 07:17
      음... 그렇겠군요. 그런데 조건이 한 3개? 정도? 3개정도의 조건을 동시 만족하거나 3중 하나만족... 등...
    • 송성환
    • 2001.05.16 03:39
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 명탁
      2001.05.16 03:46
      송성환 wrote: > 이런 질문을 해도 되는지는 모르겠지만.... > 초보인 저의 입장을 이해해 주신다면은 아...
    • 최용일
      2001.05.16 03:50
      안녕하세요. 최용일입니다. 아마도 자동생성하신거 같네요. Project/Options...메뉴의 Forms항목에 보시...
    • hlpark
    • 2001.05.16 03:32
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 블랙봉
      2001.05.16 04:48
      hlpark wrote: > 트리뷰를 써서 DB에 있는 데이터를 출력했습니다. > > 그리고 아이템을 추가할 수 있...
    • 최용일
      2001.05.16 03:55
      안녕하세요. 최용일입니다. DB에서 트리뷰로 추가하는 방법을 반대로 하면 되지 않나요? DB에서 읽는...
    • 똥개
      2001.05.16 03:41
      질문의 내요을 제대로 파악을 못하고... 참고글 극적여 보께요.. listview에서 클릭을 하면 tlistview.s...
    • 최용일
      2001.05.16 03:58
      안녕하세요. 최용일입니다. 무슨 말씀이신지? dll은 단지 함수라이브러리일 뿐인데요. 이미지에디터에서...
    • biz4you
    • 2001.05.16 03:19
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 돌맹이
    • 2001.05.16 02:19
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 명탁
      2001.05.16 02:42
      date 타입을 timestamp 하심 되긴되는디. 돌맹이 wrote: > 델파이와 인터베이스를 연결하는데 자꾸만 ...
    • 승추니
      2001.05.16 03:12
      정말 간만에 들어와 보네여..^^" 오래된 기억이긴 하지만 (안되면 어떻하쥐..) IBConsol에서 된다면,...
    • 돌맹이
      2001.05.16 03:08
      그런데 문제는 3개인 테이블도 에러가 난다는 거죠... 다른테이블도 형이 잘못 되었다고 하네요. 이해가 ...
    • 명탁
      2001.05.16 03:29
      아뇨 dialect 를 1루 하면 완벽 하게 됨다.. dialect3을 사용하면 인터베이스 최신 함수등등.할수 있는디...
    • 최용일
      2001.05.16 04:58
      안녕하세요. 최용일입니다. 여기에서 선이라는 것은 이미지 객체이죠? windowed컨트롤(윈도우핸들이 ...
    • 왕초보
      2001.05.16 22:28
      제가 설명을 제대로 못했네요. 죄송합니다. 선은 MoveTo,LineTo로 그렸습니다. 선을 객체화할 수 있나...
    • 최용일
      2001.05.17 04:36
      LineTo로 그린 선이든 이미지객체든 마찬가지입니다. 어디에다 그리느냐에 따라서 위에 올라갈수도 있구 아...
    • 왕초보
      2001.05.16 02:07
      저도 왕초보라 잘모르지만.. 해본경험이 생각이나서 ActiveMDIChild.Close; For i:= 0 To MDI...
    • 2001.05.16 01:43
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2001.05.16 04:34
      안녕하세요. 최용일입니다. case문이나 집합에서는 서수형만 사용가능합니다. 그러니까 그러한 방법은 ...
    • 노상균
    • 2001.05.16 01:34
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 왕초보
      2001.05.16 02:12
      콤보박스의 OnChange라는 이벤트에 Label1.Caption := ComboBox1.Text라고 하면 됩니다. 밑에 처럼.. p...
    • 망치
      2001.05.16 02:02
      노상균 wrote: > Combobox에서 Items에 문자들을 넣었습니다. > > 이순신 > 강감찬 > 을지문덕...
    • 최용일
      2001.05.16 04:38
      안녕하세요. 최용일입니다. StrToInt함수를 사용해서 Hex값을 숫자로 바꾸어서 다시 문자열로 바꾸어 연...
    • 바보
    • 2001.05.16 00:51
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김아성
    • 2001.05.16 00:44
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 김양우
      2001.05.16 03:21
      제가 한번 구현해 봤습니다. // 메인루틴 1. 화일을 연다 2. while (화일의 끝이 아니...
    • 망치
      2001.05.16 02:21
      김아성 wrote: > 텍스트(txt) 화일을 읽어서 db에 저장할려고 합니다. > 현재 txt 화일에는 > 1|M11060...
    • 하기
      2001.05.16 01:20
      한줄로 쭉~~~ 붙어 있다면... Cutting하기가 좀 애매 하군요... 그럼...Pos함수를 써서 해보세요... 그럼...