有一个很规则的txt文档如下,想筛选出第二列为2430,2200的记录,可不可以不转换成数据库文件,或*.xls文件,求最简单的筛选方法。(注:该文件很大,有几万条记录,而且第二列排列没有规则)。
4402 2400 4402240015150001500144022
4402 2430 4402243006100001700144022
4402 2430 4402243006100001900144022
4402 2430 4402243006100002000144022
4402 2430 4402243015100026400144022
4402 2430 4402243015100036300144022
4402 2430 4402243015100036400144022
4402 2430 4402243015100036500144022
4402 2430 4402243015100036600144022
4402 2430 4402243015100036700144022
4402 2430 4402243015100036800144022
4402 2430 4402243015100036900144022
4402 2430 4402243015100037000144022
4402 2430 4402243015100042300144022
4402 2430 4402243015100046900144022
4402 2200 4402243015100047100144022
4402 2430 4402243015100047200144022
4402 2550 4402243015100047400144022
4402 2430 4402243015100047500144022

解决方案 »

  1.   

    如果很规则的话,可以以二进制的方式打开它:
    type
      TDataRec = packed record
        field1: array[1..5] of char;
        field2: array[1..4] of char; <<比较这个字段
        field3: array[1..Length(' 4402240015150001500144022' + sLineBreak)] of char;
      end;var
      vFile: file of TDataRec;...
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Memo2: TMemo;
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}const
      BufferSize = 4 * 1024;
      Field3Length = Length('4402240015150001500144022');
      Field3Length2 = 1 + Field3Length + Length(sLineBreak);
          //if it is mac/unix format, use 1 instead length(sLineBreak)type
      TDataRec = packed record
        Field1: array[1..5] of Char;
        Key: Integer; //<<比较这个字段
        Field3: array[1..Field3Length2] of Char;
      end;
      PDataRec = ^TDataRec;  TBuffer = array[1..BufferSize] of Char;const
      DataRecSize = SizeOf(TDataRec);var
      vMatches1, vMatches2: Integer;
      Buffer: TBuffer;
      TempDataRec: TDataRec;
      vInsertCount, vInvalidCount: Integer;procedure SaveToDB(aRecData: PDataRec);
    var
      vS, vS2: string;
    begin
      SetLength(vS, SizeOf(aRecData^.Key));
      Move(aRecData^.Key, vS[1], SizeOf(aRecData^.Key));
      vS2 := Copy(aRecData^.Field3, 2, Field3Length);  //for test
      //  Form1.Memo1.Lines.Add(aRecData^.Field1 + vS + ' ' + vS2);  //Query1.Params[0].AsString := Copy(aRecData^.Field1, 1, 4);
      //Query1.Fields[1].AsString := S;
      //Query1.Fields[2].AsString := vS2;
      //Query1.Execute;  Inc(vInsertCount);
    end;procedure Main(const aFileName: string);
    var
      vRemainSize, vReadSize, vCursor, vFragSize, vRecInBuffer: Integer;
      vBeginTime: TDateTime;
      vRecData: PDataRec;
      vFileStream: TStream;  procedure TestRec(aRecData: PDataRec);
      begin
        if (aRecData^.Key = vMatches1) or (aRecData^.Key = vMatches2) then
          SaveToDB(aRecData)
        else
          Inc(vInvalidCount);
      end;
      
    begin
      vBeginTime := Now;  //what to match
      Move('2430', vMatches1, SizeOf(vMatches1));
      Move('2200', vMatches2, SizeOf(vMatches2));  //Query1.Close;
      //Query1.Sql.Text := 'insert into TMyTableName values ( :field1, :field2, :field3 ) ';
      //Query1.Prepare;  vInsertCount := 0;
      vInvalidCount := 0;  vFragSize := 0;  Form1.Memo1.Lines.BeginUpdate;
      Form1.Memo1.Clear;
      vFileStream := TFileStream.Create(aFileName, fmOpenRead);
      try
        vRemainSize := vFileStream.Size;    while vRemainSize > DataRecSize do
        begin
          if vRemainSize > BufferSize then vReadSize := BufferSize
          else vReadSize := vRemainSize;
          Dec(vRemainSize, vReadSize);      vFileStream.ReadBuffer(Buffer, vReadSize);
          vCursor := 1;
          vRecData := @Buffer;      if (vFragSize < 0) then
          begin
            Move(Buffer, PByteArray(@TempDataRec)^[DataRecSize + vFragSize], -vFragSize);
            TestRec(@TempDataRec);
            vRecData := Pointer(Integer(vRecData) - vFragSize);
            vRecInBuffer := (vReadSize + vFragSize) div DataRecSize;
            vFragSize := (vReadSize + vFragSize) mod DataRecSize;
          end
          else
          begin
            vRecInBuffer := vReadSize div DataRecSize;
            vFragSize := vReadSize mod DataRecSize;
          end;      while vCursor <= vRecInBuffer do
          begin
            TestRec(vRecData);        Inc(vCursor);
            Inc(vRecData);
          end;      if vFragSize > 0 then
          begin
            Move(Buffer[BufferSize-vFragSize+1], TempDataRec, vFragSize);
            vFragSize := vFragSize - DataRecSize;
          end;
        end;
      finally
        vFileStream.Create;
        Form1.Memo1.Lines.EndUpdate;
      end;  Form1.Caption := Format('%d / %d ( %d ): %s', [vInsertCount, vInvalidCount,
          vInsertCount + vInvalidCount, TimeToStr(Now-vBeginTime)]);
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      Main('File1.txt');
    end;end.
      

  3.   

    我做过类似的, 很简单:var
      List, L: TStringList;
      i, count: integer;
      Str: string;
    begin
      List := TStringlist.create;
      L := TStringList.create;
      List.LoadFromFile('Txt.txt');
      count := List.Count - 1;
      for i := 0 to count do
      begin
        Str := List.strings[i];
        if (copy(Str, 6, 4) = '2430') or (copy(Str, 6, 4) = '2200' ) then 
          L.Add(Str);
      end;
      List.Free;
      L.saveToFile('sorted.txt');
      L.free
    end;