有一个很规则的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
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
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;...
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.
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;