有一个文本文件,2W行,每行65个字节
本人想查询指定内容后删除内容所在的行,
除了把文件整个读进来操作后再写回外还有别的方法吗??如:
123123123...
dfsasdfwer...
#$%^&*())...我要找dfs,然后把dfs所在行删除
结果就是
123123123...
#$%^&*())...
本人想查询指定内容后删除内容所在的行,
除了把文件整个读进来操作后再写回外还有别的方法吗??如:
123123123...
dfsasdfwer...
#$%^&*())...我要找dfs,然后把dfs所在行删除
结果就是
123123123...
#$%^&*())...
解决方案 »
- Q币作答谢——已知一程序中的DBgrid控件的句柄,另一程序如何获取它里面的数据
- StringGrid的问题。请问如何让StringGrid的某单元格赋上颜色并闪烁,单元格字体颜色如何控制?多谢!!!
- DbGridEh的DbClick事件怎么不能得到选中的行数呢,请大侠指教
- 有二个FORM当按下L键时再双击鼠标就会出来第二个FORM否则出来是第一个FORM
- 关于播放AVI
- 如何把读取的数据写到缓冲区。
- 关于quickreport的两个问题
- Indy Http控件能够在ActiveX Form中使用吗?
- 关于WebBrowser问题的相关讨论
- 300分买一个qq,目录先付75分。将qq号与密码发入我的邮箱[email protected]
- dll函数调用问题!有代码...
- fastreport报表文件(*.frf)是文本文件还是二进制文件
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;b,d:TstringList;l:string;
begin
if OpenDialog1.Execute then
begin
b:=TstringList.Create ;
d:=TstringList.Create ;
d.Clear;
b.LoadFromFile(OpenDialog1.FileName);//打开相应的文件逐行读取;
for i:=0 to b.Count-1 do
begin
l:=b.Strings[i];
if pos('123',l)>0 then //查找到含指定字符串的一行;
l:=''; //清空;
if l<>'' then //字符串不为空则保存,为空继续执行
d.Add(l);
end;
end;
d.SaveToFile(OpenDialog1.FileName); //读完后保存新生成的文件,若不想覆盖
d.Free; 原文件,可以用OpenDialog1.FileName
b.Free; 直接加个后缀,这样就可以不破坏原文件
ShowMessage('Ok'); 而得到一个新的文件!
end;
这个TstringList.loadfromfile是以什么为分隔的?
因为每条记录是65个字节,可能其中有换行符什么的,所以一条记录有可能不是一行,这样得到的行数可能不对吧?xixuemao(动感超淫) :
内存映射怎么做?
我的想法是用tfilestream,以流的方式一行一行的读取数据,再选择性的删除。
没实现过,当我瞎讲的。其实是想近来等答案~~~~~~~~~********************************************************************
*TryMyBestToKnowSomethingAboutEverythingAndEverythingAboutSomething!
********************************************************************
var
F1,F2 : TextFile;
s : string;
begin
AssignFile(F1,'E:\a.txt');
Reset(F1);
AssignFile(F2,'E:\a.bak');
Rewrite(F2); while not Eof(F1) do
begin
Readln(F1, s);
if AnsiPos('dfs',s)=0 then
begin
Writeln(F2,s);
end;
end;
CloseFile(F1);
Erase(F1);
CloseFile(F2);
RenameFile('E:\a.bak','E:\a.txt');end;
还有一点就是,这个文件可能会用在linux系统下。====================问题就是这样,有不足,后面再补充==========================
=============================分不够可以再加===================================
var st:TStringList;
begin
st:=TStringList.Create;
st.LoadFromFile('D:\1.txt');
st.Text:=AnsiReplaceStr(st.Text,'hehe'+#13#10+' test','');//允许换行
st.SaveToFile('D:\2.txt');
ShowMessage('ok');
end;
var st:TStringList;
begin
st:=TStringList.Create;
st.LoadFromFile('D:\1.txt');
st.Text:=AnsiReplaceStr(st.Text,'hehe'+#13#10+' test','');//允许换行
st.SaveToFile('D:\2.txt');
st.Free;
ShowMessage('ok');
end;
这样读出来每个Tstringlist.string[index]都是65个字节吗?
这样读出来每个Tstringlist.string[index]都是65个字节吗?
----------------------------------------------
Tstringlist.string[index]的内容是由你的文本内容决定的
2W条也就1M多,而且数据量也不会再增加很多。
但是内存映射这个东东没做过,不知道如何下手,能给个例子吗?hellolongbin(一个人[终不似 少年游]) :
因为一条记录中可能会有换行,如果用Tstringlist读会把一条记录隔断,那么这就不合适了。
{============================================================}
我原来想用Tfilestream来做,但是不知道怎么一次把65个字节清除.
----------------
你没看懂我举的例子
123123123....
..dfwewererer//(共65字节)
而Tstringlist读成两行的话,那肯定是不行的啊
严重感谢hellolongbin(一个人[终不似 少年游]) 的大力帮助~~~感觉分太少不好分,加到100先~结帐