Q&A

  • [질문]파일1내용에서 파일2내용을 제외하기위한 빠른방법이 없을까요?
아래와 같이 하였는데 각각 파일크기가(줄수가 50,000이상) 커지면 시간이 3분이상 꽤 오래 걸려서
더 빠른 방법이 없을까요? 고수님들 도움 부탁드립니다.

<!--CodeS-->
  strList1.LoadFromFile('File1.txt');
  strList2.LoadFromFile('File2.txt');

  n0 := 0; m := 0;
  for n := n0 to strList2.Count - 1 do
  begin
        while m <= strList1.Count -1 do
        begin
           if strList1.Strings[m] > strList2.Strings[n] then
              break
           else if strList1.Strings[m] < strList2.Strings[n] then
              m := m + 1
           else  //파일2줄이 파일1줄에 있으면
              strList1.Delete(m);
        end;
  end;
<!--CodeE-->
2  COMMENTS
  • Profile
    최용일 2010.09.28 02:39
    TStringList자체가 파일읽어서 줄별로 나누기 위해서 파싱을 하니까 파일이 커지면 시간이 오래걸릴 수 밖에 없을듯한데요...

    더 빠른 방법은 아니지만... ReadLn같은 파일입출력함수를 사용하면 읽어오느라 대기하는 시간은 없겠지만 전체적인 속도는 비슷할 듯...
  • Profile
    신철우 2010.10.01 23:43
    아래와 같이 하면 엄청 빨라짐.
    <!--CodeS-->
    // 빼기 대상 strList1의 index를 스트링리스트로 저장하고
    del_idx := TStringList.Create;
    n0 := 0; m := 0;
    for n := n0 to strList2.Count - 1 do
    begin //탈출조건
    if (m > strList1.Count - 1) or (strList1[m] > strList2[strList2.Count - 1]) then break;

    while m <= strList1.Count -1 do
    begin
    if strList1[m] > strList2[n] then
    break
    else if strList1[m] = strList2[n] then
    del_idx.Add(inttostr(m));

    m := m + 1;
    end;
    end;

    //2단계로 strList1과 빼기대상 스트링리스트를 비교하여 없으면 buf에 담기.
    buf := TStringList.Create;
    m := 0;
    try
    buf.Sorted := True;
    buf.BeginUpdate;
    for n := 0 to strList1.Count - 1 do
    begin
    if (m <= del_idx.Count - 1) and (n = strtoint(del_idx[m])) then
    m := m + 1
    else
    buf.Add(strList1[n]);
    end;
    buf.EndUpdate;
    strList1.Assign(buf);
    finally
    FreeandNil(buf);
    end;
    FreeandNil(del_idx);
    <!--CodeE-->