Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
readln에서 char(10) 처리 문제..
100메가 정도 되는 큰 text 파일을 한 줄씩 읽어들이려고 하는데요..
문제는 그 파일에 char(13)뿐만 아니라..
char(10)으로 line이 나뉘어져 있는게 문제입니다.. ㅠ.ㅠ
readln으로 읽어들이면 char(13)에서만 끊어버리기 때문에..
이것을 못 쓰는데요..
그래서.. read로 한 글자씩 읽었더니 시간이 너무 오래 걸리구요..
어떻게 좋은 해결책이 없을까요?
1
COMMENTS
류종택
•
2001.04.02 08:33
우선 100메가나 되는 텍스트 화일에다가
13 또는 10으로 섞여서 라인처리된 것이 본인의 뜻이었다면..
그것을 바꾸라는 쓸데없는 조언을 드리고 싶네요.
부득히 사정이 있을 듯 한데.. 아니라면 설계를 다시 점검하실 필요는??
여하튼 질문하신 내용은 택스트로 처리할 방도가 없는 듯 합니다.
결국 바이너리처럼 읽어서 하나 하나 처리해주는 수 밖에요.
한 바이트씩 읽어오는 것은 원래 퍼포먼스에 문제가 있는 방법이니.
결국 버퍼를 통해서 한 거번에 읽어오고 처리 후 다음을 읽는 식으로 할 수 밖에 없어요. 그렇다고 해도 100메가라면 여전히 느릴 수 밖에 없지만..
아래 예제는 제가 터보파스칼 4.0인가 5.0 때 대용량 화일 처리에 필요해서 만든 겁니다.
컴파일은 되네요.. 하지만 예전에 무신 버그가 있었던 걸 고친 기억이 나는데..
10년 전 일이라서 이것이 버그가 고쳐진 버젼인지는 모르겠습니다. 죄송 --;
기능은 화일을 마치 배열처럼 사용할 수 있도록하는 것입니다.
마치 기가 바이트 짜리 배열처럼요. 배열이 아무래도 사용이 쉽자나요.
버퍼링을 하기 때문에 속도 저하문제는 어느 정도 해결될거고요.
사용방법은 아래와 같습니다.
(저도 한 참 해멨어요.. 너무 오래된 파일이라 --;)
procedure TForm1.Button1Click(Sender: TObject);
Var
Ch : Char;
Loop : Integer;
SwapFile : SwapType;
begin
SwapFile.DataSize:= 1;
SwapFile.BufferSize:= 4096;
SwapFile.OpenBufferFile('C:Data.Dat');
For Loop:= 1 to 10 do
Begin
SwapFile.DataInFile(Loop, @Ch);
Memo1.Text:= Memo1.TextCh);
End;
SwapFile.CloseBufferFile;
end;
From 류..
---------
{$I-}
Unit Swap;
Interface
Type
BufferType = Packed Array [1..$FFFF] of Byte;
SwapType = Object
Private
BufferFile : File;
Pos, RRead : Integer;
Buffer : ^BufferType;
Public
BufferSize, DataSize, ListSize, FSize : Integer;
Procedure OpenBufferFile(FileName:String);
Function ByteInFile(Index:Integer):Byte;
Procedure DataInFile(Index:Integer; Data:Pointer);
Procedure CloseBufferFile;
End;
Var
SwapError : Byte;
Implementation
Procedure SwapType.OpenBufferFile(FileName:String);
Begin
AssignFile(BufferFile, FileName);
Reset(BufferFile, 1);
If IOResult <> 0 then
Begin
SwapError:= IOResult;
Pos:= 1;
FSize:= 0;
ListSize:= 0;
End
Else
Begin
SwapError:= 0;
GetMem(Buffer, BufferSize+DataSize);
Pos:= 1;
FSize:= FileSize(BufferFile);
ListSize:= FSize Div DataSize;
If FSize >= BufferSize+DataSize then
BlockRead(BufferFile, Buffer^, BufferSize+DataSize, RRead)
Else
BlockRead(BufferFile, Buffer^, FSize, RRead);
End;
End;
Function SwapType.ByteInFile(Index:LongInt):Byte;
Var
Temp : Integer;
Begin
Result:= 0;
If FSize = 0 then Exit;
Temp:= ((Index-1) Div BufferSize) + 1;
If Temp <> Pos then
Begin
Pos:= Temp;
Temp:= FSize - (Pos-1)*BufferSize;
Seek(BufferFile, (Pos-1)*BufferSize);
If Temp >= BufferSize then
BlockRead(BufferFile, Buffer^, BufferSize, RRead)
Else
BlockRead(BufferFile, Buffer^, Temp, RRead);
End;
Temp:= Index - (Pos-1)*BufferSize;
ByteInFile:= Buffer^[Temp];
End;
Procedure SwapType.DataInFile(Index:LongInt; Data:Pointer);
Var
Temp : Integer;
Begin
If FSize = 0 then Exit;
Temp:= (((Index-1)*DataSize) Div BufferSize) + 1;
If Temp <> Pos then
Begin
Pos:= Temp;
Temp:= FSize - (Pos-1)*BufferSize;
Seek(BufferFile, (Pos-1)*BufferSize);
If Temp >= BufferSize+DataSize then
BlockRead(BufferFile, Buffer^, BufferSize+DataSize, RRead)
Else
BlockRead(BufferFile, Buffer^, Temp, RRead);
End;
Temp:= Index - ((Pos-1)*(BufferSize Div DataSize));
Move(Buffer^[(Temp-1)*DataSize+1], Data^, DataSize);
End;
Procedure SwapType.CloseBufferFile;
Begin
If FSize = 0 then Exit;
CloseFile(BufferFile);
FreeMem(Buffer, BufferSize+DataSize);
End;
End.
초보 wrote:
>
> 100메가 정도 되는 큰 text 파일을 한 줄씩 읽어들이려고 하는데요..
>
> 문제는 그 파일에 char(13)뿐만 아니라..
>
> char(10)으로 line이 나뉘어져 있는게 문제입니다.. ㅠ.ㅠ
>
> readln으로 읽어들이면 char(13)에서만 끊어버리기 때문에..
>
> 이것을 못 쓰는데요..
>
> 그래서.. read로 한 글자씩 읽었더니 시간이 너무 오래 걸리구요..
>
> 어떻게 좋은 해결책이 없을까요?
>
>
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
송은홍
•
2001.04.02 21:17
1
COMMENTS
/
0
LIKES
win 98/2000 간의 serial 통신에 관하여
쭉쭉빵빵
•
2001.04.03 04:25
송은홍 wrote: > > 안녕하세요? > > 3일동안 고민고민과 방법을 바꿔가면서 Test & Test를 해보다가 ...
궁그미
•
2001.04.02 21:14
1
COMMENTS
/
0
LIKES
ClientSocket 프로퍼티중 host와 address의 차이점은?
이경문
•
2001.04.03 00:28
ip address -> 실제 통신 host name -> ip address -> 실제 통신 host name이 명시되었으면 host nam...
^-_-^
•
2001.04.02 21:00
1
COMMENTS
/
0
LIKES
작업시 창 움직이기??
바버
•
2001.04.02 21:09
^-_-^ wrote: > yo` > > 안녕하세요!! > > 쿼리나, 기타 다른 시간이 좀 걸리는 작업시 폼을 움직이...
바버
•
2001.04.02 20:59
2
COMMENTS
/
0
LIKES
델파이4 와 델파이5 같이 한 피시에서 같이 쓰는 법?
초보자
•
2001.04.03 10:56
바버 wrote: > 제목 그대롭니다... > 저번주 토요일날 질문 올렸는데 답변이 없어서 다시 올립니다... >...
바버
•
2001.04.05 00:35
하두 답변이 없길래 암두 안해 주신줄 알았는데... 답변감사합니다... 즐코하세요,,,
[초짜]
2001.04.02 20:52
0
COMMENTS
/
0
LIKES
DB2연동 스토어드프로시저 사용법
sorapig
•
2001.04.02 19:44
3
COMMENTS
/
0
LIKES
쓰레드에 파라메타 주기
모모
•
2001.04.02 19:57
sorapig wrote: > TSchdule_process.Create(ThreadID); > > 이런 식을로 쓰레드를 생성 시킬때 쓰레드...
sorapig
•
2001.04.02 21:12
모모 wrote: > sorapig wrote: > > TSchdule_process.Create(ThreadID); > > > > 이런 식을로 쓰레드...
모모
•
2001.04.02 21:30
sorapig wrote: > 모모 wrote: > > sorapig wrote: > > > TSchdule_process.Create(ThreadID); > > > ...
초보는힘들어
•
2001.04.02 19:09
1
COMMENTS
/
0
LIKES
interbase를 stand alone으로 사용할 수 있을까요?
감초
•
2001.04.03 01:54
그냥 혼자서 쓰심 됩니다. 네트웍 사용자에게 연결만 안시기심 혼자 사용하는거나 다름 없겠죠. 초보는...
쫑아랍니다.
2001.04.02 18:54
0
COMMENTS
/
0
LIKES
메모의 내용을 qreport에서 출력하려하는뎅...
novice
•
2001.04.02 18:45
1
COMMENTS
/
0
LIKES
ini 파일에서 키값가져오기
서철기
•
2001.04.02 18:50
예를 들면.. readstring('Geometry','NI',''); [Geometry]섹션에 NI키로 정의 되어 있는 값이 있으면...
문디
•
2001.04.02 18:02
1
COMMENTS
/
0
LIKES
인터베이스 접속법좀 갈켜주세요
명탁
•
2001.04.02 22:54
문디 wrote: > 인터베이스를 C/S 환경에서 사용할려고 합니다 > 로칼일때는 접속이 잘되는데 > 서버에 d...
델초
•
2001.04.02 17:58
1
COMMENTS
/
0
LIKES
윈98에서만들은 인스톨프로그림이2000에서는 안되요?
최용일
•
2001.04.02 19:24
잘 되는데요... 델초 wrote: > 윈98에서만들은 인스톨프로그림이윈2000프로패셔널 > 버젼에서 인스톨...
한운기
•
2001.04.02 16:23
1
COMMENTS
/
0
LIKES
코딩으로 칼럼갯수조절하는방법 알켜주세요
이희정
•
2001.04.02 19:37
한운기 wrote: > 동적으로 테이블을 만들어 DBGrid에서 나타낼려고 하는데 > DBGrid에 나타나는 칼럼의 ...
진짜왕초보!
•
2001.04.02 23:53
1
COMMENTS
/
0
LIKES
EditBox간에 커서 이동 후 입력이 안됩니다.
최용일
•
2001.04.02 23:54
안녕하세요. 최용일입니다. 어떤 코드인지 전혀 이해할 수가 없네요... 그냥 간단히 한번 만들어 봤습니...
김미연
•
2001.04.02 23:59
1
COMMENTS
/
0
LIKES
Table에서 Filter사용시 'Field XXX not found' 에러
srookie
•
2001.04.03 00:00
김미연 wrote: > 검색하는 부분이 이중검색이라 할수 있는데여... > 그러니까 검색버튼을 누를시... > ...
델초보
•
2001.04.02 06:49
2
COMMENTS
/
0
LIKES
두개의 Table의 레코드를 검색해서 하나의 DBGrid에 넣으려고 합니다. 도와 주세요.
류종택
•
2001.04.02 08:40
쿼리문을 사용해서 아래처럼 해보세요.. Select * from Test1 A Union all Select * from Test B ...
델초보
•
2001.04.02 11:44
류종택 wrote: > 쿼리문을 사용해서 아래처럼 해보세요.. > > Select * from Test1 A > Union all S...
호기심소년
•
2001.04.02 06:41
1
COMMENTS
/
0
LIKES
계산기를 한번 만들고 픈데 답변좀......
류종택
•
2001.04.02 09:08
인터페이스가 제대로 이해가 안갑니다. (너무 졸려서 인가?) 인터페이스를 바꿔보려다가 그냥 제가 이해...
김남규
•
2001.04.02 06:00
3
COMMENTS
/
0
LIKES
한글 입력이 안됩니다.
이가을
•
2001.04.02 20:52
폰트에서 스크립트가 한글로 되있는지 확인해보시겠어요? 김남규 wrote: > 저희 프로젝트에서 델파이로...
김남규
•
2001.04.03 18:13
언어를 말씀하시는거죠? 물론 한글로 되어있습니다. ImeMode 도 imSHanguel로 되어있습니다. 저의 경...
하눌이
•
2001.04.02 18:17
답변은 아니고 저도 예전에 비슷한 경험이 있습니다. WIN98에서 작성된 프로그램이 였고 edit에다 imeMode...
완전 초짜~
•
2001.04.02 04:10
2
COMMENTS
/
0
LIKES
델파이 초짜~
류종택
•
2001.04.02 08:45
우선 두 DB (정확하게는 테이블)을 사용해서 구현하려는 것은 가능합니다. 또한 테이블에 사용자의 아이디...
완전 초짜~
•
2001.04.03 08:56
이메일로 답변 받았습니다.. 감사하다는 말씀 드리고 싶네요..(--)(__)(--)(__) 류종택 wrote: > 우선...
초보
•
2001.04.02 01:28
1
COMMENTS
/
0
LIKES
readln에서 char(10) 처리 문제..
100메가 정도 되는 큰 text 파일을 한 줄씩 읽어들이려고 하는데요.. 문제는 그 파일에 char(13)뿐만 아니라.. char(10)으로 line이 나뉘어져 있는게 문제입니다.. ㅠ.ㅠ readln으로 읽어들이면 char(13)에서만 끊어버리기 때문에.. 이것...
류종택
•
2001.04.02 08:33
우선 100메가나 되는 텍스트 화일에다가 13 또는 10으로 섞여서 라인처리된 것이 본인의 뜻이었다면.. 그...
델초보
•
2001.04.01 23:31
1
COMMENTS
/
0
LIKES
: 스크롤바가 만들어 질때 그리고 사라질때 발생하는 이벤트..
최용일
•
2001.04.02 19:16
안녕하세요. 최용일입니다. 폼의 AutoScroll을 False로 하세요. 그럼 스크롤바가 안나타납니다. ^^ ...
초보
2001/04/02 01:28
Views
157
Likes
0
Comments
1
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
13 또는 10으로 섞여서 라인처리된 것이 본인의 뜻이었다면..
그것을 바꾸라는 쓸데없는 조언을 드리고 싶네요.
부득히 사정이 있을 듯 한데.. 아니라면 설계를 다시 점검하실 필요는??
여하튼 질문하신 내용은 택스트로 처리할 방도가 없는 듯 합니다.
결국 바이너리처럼 읽어서 하나 하나 처리해주는 수 밖에요.
한 바이트씩 읽어오는 것은 원래 퍼포먼스에 문제가 있는 방법이니.
결국 버퍼를 통해서 한 거번에 읽어오고 처리 후 다음을 읽는 식으로 할 수 밖에 없어요. 그렇다고 해도 100메가라면 여전히 느릴 수 밖에 없지만..
아래 예제는 제가 터보파스칼 4.0인가 5.0 때 대용량 화일 처리에 필요해서 만든 겁니다.
컴파일은 되네요.. 하지만 예전에 무신 버그가 있었던 걸 고친 기억이 나는데..
10년 전 일이라서 이것이 버그가 고쳐진 버젼인지는 모르겠습니다. 죄송 --;
기능은 화일을 마치 배열처럼 사용할 수 있도록하는 것입니다.
마치 기가 바이트 짜리 배열처럼요. 배열이 아무래도 사용이 쉽자나요.
버퍼링을 하기 때문에 속도 저하문제는 어느 정도 해결될거고요.
사용방법은 아래와 같습니다.
(저도 한 참 해멨어요.. 너무 오래된 파일이라 --;)
procedure TForm1.Button1Click(Sender: TObject);
Var
Ch : Char;
Loop : Integer;
SwapFile : SwapType;
begin
SwapFile.DataSize:= 1;
SwapFile.BufferSize:= 4096;
SwapFile.OpenBufferFile('C:Data.Dat');
For Loop:= 1 to 10 do
Begin
SwapFile.DataInFile(Loop, @Ch);
Memo1.Text:= Memo1.TextCh);
End;
SwapFile.CloseBufferFile;
end;
From 류..
---------
{$I-}
Unit Swap;
Interface
Type
BufferType = Packed Array [1..$FFFF] of Byte;
SwapType = Object
Private
BufferFile : File;
Pos, RRead : Integer;
Buffer : ^BufferType;
Public
BufferSize, DataSize, ListSize, FSize : Integer;
Procedure OpenBufferFile(FileName:String);
Function ByteInFile(Index:Integer):Byte;
Procedure DataInFile(Index:Integer; Data:Pointer);
Procedure CloseBufferFile;
End;
Var
SwapError : Byte;
Implementation
Procedure SwapType.OpenBufferFile(FileName:String);
Begin
AssignFile(BufferFile, FileName);
Reset(BufferFile, 1);
If IOResult <> 0 then
Begin
SwapError:= IOResult;
Pos:= 1;
FSize:= 0;
ListSize:= 0;
End
Else
Begin
SwapError:= 0;
GetMem(Buffer, BufferSize+DataSize);
Pos:= 1;
FSize:= FileSize(BufferFile);
ListSize:= FSize Div DataSize;
If FSize >= BufferSize+DataSize then
BlockRead(BufferFile, Buffer^, BufferSize+DataSize, RRead)
Else
BlockRead(BufferFile, Buffer^, FSize, RRead);
End;
End;
Function SwapType.ByteInFile(Index:LongInt):Byte;
Var
Temp : Integer;
Begin
Result:= 0;
If FSize = 0 then Exit;
Temp:= ((Index-1) Div BufferSize) + 1;
If Temp <> Pos then
Begin
Pos:= Temp;
Temp:= FSize - (Pos-1)*BufferSize;
Seek(BufferFile, (Pos-1)*BufferSize);
If Temp >= BufferSize then
BlockRead(BufferFile, Buffer^, BufferSize, RRead)
Else
BlockRead(BufferFile, Buffer^, Temp, RRead);
End;
Temp:= Index - (Pos-1)*BufferSize;
ByteInFile:= Buffer^[Temp];
End;
Procedure SwapType.DataInFile(Index:LongInt; Data:Pointer);
Var
Temp : Integer;
Begin
If FSize = 0 then Exit;
Temp:= (((Index-1)*DataSize) Div BufferSize) + 1;
If Temp <> Pos then
Begin
Pos:= Temp;
Temp:= FSize - (Pos-1)*BufferSize;
Seek(BufferFile, (Pos-1)*BufferSize);
If Temp >= BufferSize+DataSize then
BlockRead(BufferFile, Buffer^, BufferSize+DataSize, RRead)
Else
BlockRead(BufferFile, Buffer^, Temp, RRead);
End;
Temp:= Index - ((Pos-1)*(BufferSize Div DataSize));
Move(Buffer^[(Temp-1)*DataSize+1], Data^, DataSize);
End;
Procedure SwapType.CloseBufferFile;
Begin
If FSize = 0 then Exit;
CloseFile(BufferFile);
FreeMem(Buffer, BufferSize+DataSize);
End;
End.
초보 wrote:
>
> 100메가 정도 되는 큰 text 파일을 한 줄씩 읽어들이려고 하는데요..
>
> 문제는 그 파일에 char(13)뿐만 아니라..
>
> char(10)으로 line이 나뉘어져 있는게 문제입니다.. ㅠ.ㅠ
>
> readln으로 읽어들이면 char(13)에서만 끊어버리기 때문에..
>
> 이것을 못 쓰는데요..
>
> 그래서.. read로 한 글자씩 읽었더니 시간이 너무 오래 걸리구요..
>
> 어떻게 좋은 해결책이 없을까요?
>
>