Q&A

  • 파일 크기가 클 경우 첫 라인만 읽은 후(Readln) Eof가 됩니다.
* 사용환경 : 델파이5 / Windows Me

델파이 초보자가 문의 드립니다.

text 화일을 읽어 db Table에 넣는 기능을 구현하다가 해결법을 못찾고 있습니다.

text 화일 크기가 750 KB 정도 되는데( 14,900 lines)

문제는 Readln(FileNAme, v1, v2, ,,,) 으로 라인단위로 읽어서 테이블에 하나씩 추가하는데

화일크기가 클경우(750KB) 첫라인만 읽고 eof 이 True가 되어버리는 문제가 발생합니다.

text 화일크기를 줄여서 16,747 Bytes로 하면은(316 라인) 끝까지(316 라인) 다 읽습니다.



소스는 아래와 같습니다.



또 TMemo 및 TRichEdit 콤포넌트에서 처리 가능한 최대의 화일크기는 얼마입니까?



고수님들의 답변 부탁드립니다.







unit Unit1;



interface



uses

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

StdCtrls;



type

TForm1 = class(TForm)

btnExit: TButton;

btnReadText: TButton;

btnCopyText: TButton;

btnSplit2Field: TButton;

Memo1: TMemo;

Memo2: TMemo;

edtJepumName: TEdit;

lblJepumCode: TLabel;

btnReadPart: TButton;

lblPartLineText: TLabel;

Label2: TLabel;

edtLineCount: TEdit;

procedure btnExitClick(Sender: TObject);

procedure btnReadTextClick(Sender: TObject);

procedure btnCopyTextClick(Sender: TObject);

procedure btnSplit2FieldClick(Sender: TObject);

procedure btnReadPartClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.btnExitClick(Sender: TObject);

begin

Close;

end;



procedure TForm1.btnReadTextClick(Sender: TObject);

var

MyTextFile: TextFile;

S50: string[50];

JepumCode: string[20];

JepumName: string[30];

i: integer;

begin

AssignFile(MyTextFile, 'part2.txt');

Reset(MyTextFile);

Memo1.Clear;

Memo2.Clear;

try

while not Eof(MyTextFile) do

begin

Readln(MyTextFile, S50);

Memo1.Lines.Add(S50);

end;

CloseFile(MyTextFile);

Reset(MyTextFile);

while not Eof(MyTextFile) do

begin

Readln(MyTextFile, JepumCode, JepumName);

Memo2.Lines.Add(JepumCode+JepumName);

end;

finally

CloseFile(MyTextFile);

end;

end;



procedure TForm1.btnCopyTextClick(Sender: TObject);

var

MyTextFile: TextFile;

CopyTextFile: TextFile;

S: string;

i: integer;

begin

AssignFile(MyTextFile, 'MyTestFile.txt');

AssignFile(CopyTextFile, 'part_copy.txt');

Append(MyTextFile);

try

for i := 10 to 100 do

begin

S := 'This is line # ';

writeln(MyTextFile, S, i);

end;

finally

CloseFile(MyTextFile);

end;

end;



procedure TForm1.btnSplit2FieldClick(Sender: TObject);

var

MyTextFile: TextFile;

S15: string[15];

i: integer;

j: integer;

begin

AssignFile(MyTextFile, 'MyTestFile.txt');

Reset(MyTextFile);

try

while not Eof(MyTextFile) do

begin

Readln(MyTextFile, S15, j);

Memo1.Lines.Add(S15 + ' - ' + IntToStr(j));

end;

finally

CloseFile(MyTextFile);

end;

end;



procedure TForm1.btnReadPartClick(Sender: TObject);

var

PartTextFile: TextFile;

S50: string[50];

JepumCode: string[20];

JepumName: string[30];

i: integer;

begin

AssignFile(PartTextFile, 'part2.txt');

Reset(PartTextFile);

i := 0;

try

while not Eof(PartTextFile) do <<<----- 에러가 나는 부분 - 한줄 읽고

begin while loop 2번째에 while 조건을

i := i+1; 만족하여 loop를 벗어납니다.

edtLineCount.Text := intToStr(i);

Readln(PartTextFile, JepumCode, JepumName);

lblPartLineText.Caption := JepumCode+JepumName;

lblJepumCode.Caption := JepumCode;

edtJepumName.Text := JepumName;

end;

finally

CloseFile(PartTextFile);

end;

end;

end.



2  COMMENTS
  • Profile
    최은석 2000.11.21 01:49
    메모컴포넌트를 쓰시지 마시고 richedit 컴포넌트를 사용하심이 어떨런지..





    서승룡 wrote:

    > * 사용환경 : 델파이5 / Windows Me

    > 델파이 초보자가 문의 드립니다.

    > text 화일을 읽어 db Table에 넣는 기능을 구현하다가 해결법을 못찾고 있습니다.

    > text 화일 크기가 750 KB 정도 되는데( 14,900 lines)

    > 문제는 Readln(FileNAme, v1, v2, ,,,) 으로 라인단위로 읽어서 테이블에 하나씩 추가하는데

    > 화일크기가 클경우(750KB) 첫라인만 읽고 eof 이 True가 되어버리는 문제가 발생합니다.

    > text 화일크기를 줄여서 16,747 Bytes로 하면은(316 라인) 끝까지(316 라인) 다 읽습니다.

    >

    > 소스는 아래와 같습니다.

    >

    > 또 TMemo 및 TRichEdit 콤포넌트에서 처리 가능한 최대의 화일크기는 얼마입니까?

    >

    > 고수님들의 답변 부탁드립니다.

    >

    >

    >

    > unit Unit1;

    >

    > interface

    >

    > uses

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

    > StdCtrls;

    >

    > type

    > TForm1 = class(TForm)

    > btnExit: TButton;

    > btnReadText: TButton;

    > btnCopyText: TButton;

    > btnSplit2Field: TButton;

    > Memo1: TMemo;

    > Memo2: TMemo;

    > edtJepumName: TEdit;

    > lblJepumCode: TLabel;

    > btnReadPart: TButton;

    > lblPartLineText: TLabel;

    > Label2: TLabel;

    > edtLineCount: TEdit;

    > procedure btnExitClick(Sender: TObject);

    > procedure btnReadTextClick(Sender: TObject);

    > procedure btnCopyTextClick(Sender: TObject);

    > procedure btnSplit2FieldClick(Sender: TObject);

    > procedure btnReadPartClick(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.btnExitClick(Sender: TObject);

    > begin

    > Close;

    > end;

    >

    > procedure TForm1.btnReadTextClick(Sender: TObject);

    > var

    > MyTextFile: TextFile;

    > S50: string[50];

    > JepumCode: string[20];

    > JepumName: string[30];

    > i: integer;

    > begin

    > AssignFile(MyTextFile, 'part2.txt');

    > Reset(MyTextFile);

    > Memo1.Clear;

    > Memo2.Clear;

    > try

    > while not Eof(MyTextFile) do

    > begin

    > Readln(MyTextFile, S50);

    > Memo1.Lines.Add(S50);

    > end;

    > CloseFile(MyTextFile);

    > Reset(MyTextFile);

    > while not Eof(MyTextFile) do

    > begin

    > Readln(MyTextFile, JepumCode, JepumName);

    > Memo2.Lines.Add(JepumCode+JepumName);

    > end;

    > finally

    > CloseFile(MyTextFile);

    > end;

    > end;

    >

    > procedure TForm1.btnCopyTextClick(Sender: TObject);

    > var

    > MyTextFile: TextFile;

    > CopyTextFile: TextFile;

    > S: string;

    > i: integer;

    > begin

    > AssignFile(MyTextFile, 'MyTestFile.txt');

    > AssignFile(CopyTextFile, 'part_copy.txt');

    > Append(MyTextFile);

    > try

    > for i := 10 to 100 do

    > begin

    > S := 'This is line # ';

    > writeln(MyTextFile, S, i);

    > end;

    > finally

    > CloseFile(MyTextFile);

    > end;

    > end;

    >

    > procedure TForm1.btnSplit2FieldClick(Sender: TObject);

    > var

    > MyTextFile: TextFile;

    > S15: string[15];

    > i: integer;

    > j: integer;

    > begin

    > AssignFile(MyTextFile, 'MyTestFile.txt');

    > Reset(MyTextFile);

    > try

    > while not Eof(MyTextFile) do

    > begin

    > Readln(MyTextFile, S15, j);

    > Memo1.Lines.Add(S15 + ' - ' + IntToStr(j));

    > end;

    > finally

    > CloseFile(MyTextFile);

    > end;

    > end;

    >

    > procedure TForm1.btnReadPartClick(Sender: TObject);

    > var

    > PartTextFile: TextFile;

    > S50: string[50];

    > JepumCode: string[20];

    > JepumName: string[30];

    > i: integer;

    > begin

    > AssignFile(PartTextFile, 'part2.txt');

    > Reset(PartTextFile);

    > i := 0;

    > try

    > while not Eof(PartTextFile) do

    > begin

    > i := i+1;

    > edtLineCount.Text := intToStr(i);

    > Readln(PartTextFile, JepumCode, JepumName);

    > lblPartLineText.Caption := JepumCode+JepumName;

    > lblJepumCode.Caption := JepumCode;

    > edtJepumName.Text := JepumName;

    > end;

    > finally

    > CloseFile(PartTextFile);

    > end;

    > end;

    > end.

    >

  • Profile
    서승룡 2000.11.21 01:49
    문제의 맨 아래부분인 아래와 같습니다



    Tmemo 나 TRichEdit 콤포넌트 문제는 아닙니다.

    TMemo 나 TRichEdit 에서 직접 불러서 수정하는 것이 아니고 라인단위로 읽어서

    Paradox DB Table 에 한 레코드씩 추가하는 상황이기 때문에....



    상기의 문제점과 관계없이 TMemo 나 TRichEdit 에서 처리할 수 있는 text file 크기는 얼마나 되는지요...





    procedure TForm1.btnReadPartClick(Sender: TObject);

    > var

    > PartTextFile: TextFile;

    > S50: string[50];

    > JepumCode: string[20];

    > JepumName: string[30];

    > i: integer;

    > begin

    > AssignFile(PartTextFile, 'part2.txt');

    > Reset(PartTextFile);

    > i := 0;

    > try

    > while not Eof(PartTextFile) do <--- Error부분 PartTextFile 크기가 클

    > begin 경우에는 while loop 를 한번만 돌고

    > i := i+1; loop를 빠져 버립니다.

    > edtLineCount.Text := intToStr(i);

    > Readln(PartTextFile, JepumCode, JepumName);

    > lblPartLineText.Caption := JepumCode+JepumName;

    > lblJepumCode.Caption := JepumCode;

    > edtJepumName.Text := JepumName;

    > end;

    > finally

    > CloseFile(PartTextFile);

    > end;

    > end;