텍스트(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.
// 메인루틴
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;