Q&A

  • 파싱 프로그램..의 질문..코드를 넣어두었습니다. 문제가...
안녕하세요? 또다시 질문을 하게 되네요 ^^

아래 코드는 구분자를 통해 텍스트 파일의 내용을 읽어들이는 파싱 함수입니다.

근데..텍스트 파일에 1|12|123|1234 라는 내용이 있으면..



pascount(str,'|');

passtring(str,'|',4); 즉 1234를 읽어오라고 명령어를 치면..

''값이 변수에 들어갑니다.



제가 생각하기에 마지막 부분 1234를 읽어오지 못하는 거 같습니다.

고수님들께서 조금만 도와주세요 ...





function Tform2.PasCount(const s, delimiters : string) : integer;

var

delimiter : Boolean;

count,i :integer;

begin

count := 0;

delimiter := true;

if Length(s) >0 then

begin

i := 1;

while (Pos(s[i], delimiters)<> 0) and (i <= Length(s)) do

inc(i);

for i := i to length(s) do

if Pos(s[i], delimiters)<>0 then

delimiter := true

else

begin

if delimiter = true then inc(count);

delimiter := false;

end;

end;

PasCount := count ;

end;





//구분자를 통해 데이터값을 추출

function TForm2.PasString(const s, delimiters : string;num:integer):string;

var

i,j,sLength,sStart,sEnd:integer;



begin

if pasCount(s,delimiters)>num then

begin

sStart := 1;

while (Pos(s[sStart],delimiters)<> 0 ) and (sStart <= Length(s)) do inc(sStart);

for j := 1 to num -1 do

begin

while Pos(s[sStart],delimiters)=0 do inc(sStart);

while Pos(s[sStart],delimiters)<>0 do inc(sStart);

end;

sEnd := sStart;

for i := sStart to Length(s) do

begin

if s[i] = delimiters then break;

if s[i] <> delimiters then inc(sEnd);

end;

sLength := sEnd - sStart;

PasString := Trim(copy(s,sStart,sLength));

end;

else

PasString := '';

end;



1  COMMENTS
  • Profile
    최용일 2000.02.22 20:47
    아래와 같이 코딩해보세요... 아주 잘 될것입니다...



    const

    Delemeter = '|';



    function GetParserCount(const Source: string): Integer;



    var

    I: Integer;

    PS: string;

    begin

    PS := Source;

    if PS[Length(Source)] <> Delemeter then

    PS := PS + Delemeter;



    Result := 0;

    for I := 1 to Length(PS) do

    if PS[I] = Delemeter then

    Inc(Result);

    end;



    function GetParserStr(const Source: string; Index: Integer): string;

    // Index는 1부터 시작한다.

    var

    StartPos, EndPos, CurIndex, StrPos: Integer;

    PS: string;

    begin

    PS := Source;

    if PS[Length(PS)] <> Delemeter then

    PS := PS + Delemeter;



    StrPos := 1;

    CurIndex := 1;



    // 시작위치를 구한다.

    while CurIndex <> Index do

    begin

    if PS[StrPos] = Delemeter then

    Inc(CurIndex);

    Inc(StrPos);

    end;

    StartPos := StrPos;



    //끝위 치를 구한다.

    while PS[StrPos] <> Delemeter do

    Inc(StrPos);

    EndPos := StrPos;



    Result := Copy(PS, StartPos, EndPos - StartPos);

    end;







    이상학 wrote:

    > 안녕하세요? 또다시 질문을 하게 되네요 ^^

    > 아래 코드는 구분자를 통해 텍스트 파일의 내용을 읽어들이는 파싱 함수입니다.

    > 근데..텍스트 파일에 1|12|123|1234 라는 내용이 있으면..

    >

    > pascount(str,'|');

    > passtring(str,'|',4); 즉 1234를 읽어오라고 명령어를 치면..

    > ''값이 변수에 들어갑니다.

    >

    > 제가 생각하기에 마지막 부분 1234를 읽어오지 못하는 거 같습니다.

    > 고수님들께서 조금만 도와주세요 ...

    >

    >

    > function Tform2.PasCount(const s, delimiters : string) : integer;

    > var

    > delimiter : Boolean;

    > count,i :integer;

    > begin

    > count := 0;

    > delimiter := true;

    > if Length(s) >0 then

    > begin

    > i := 1;

    > while (Pos(s[i], delimiters)<> 0) and (i <= Length(s)) do

    > inc(i);

    > for i := i to length(s) do

    > if Pos(s[i], delimiters)<>0 then

    > delimiter := true

    > else

    > begin

    > if delimiter = true then inc(count);

    > delimiter := false;

    > end;

    > end;

    > PasCount := count ;

    > end;

    >

    >

    > //구분자를 통해 데이터값을 추출

    > function TForm2.PasString(const s, delimiters : string;num:integer):string;

    > var

    > i,j,sLength,sStart,sEnd:integer;

    >

    > begin

    > if pasCount(s,delimiters)>num then

    > begin

    > sStart := 1;

    > while (Pos(s[sStart],delimiters)<> 0 ) and (sStart <= Length(s)) do inc(sStart);

    > for j := 1 to num -1 do

    > begin

    > while Pos(s[sStart],delimiters)=0 do inc(sStart);

    > while Pos(s[sStart],delimiters)<>0 do inc(sStart);

    > end;

    > sEnd := sStart;

    > for i := sStart to Length(s) do

    > begin

    > if s[i] = delimiters then break;

    > if s[i] <> delimiters then inc(sEnd);

    > end;

    > sLength := sEnd - sStart;

    > PasString := Trim(copy(s,sStart,sLength));

    > end;

    > else

    > PasString := '';

    > end;

    >