求对txt文件进行删除行操作代码

goodlardy   2010-6-2 12:23 楼主
本人想把一个几万行的txt文件内的,某些行删除,手工太慢。想把带有某些字符(比如一个单词)的行全部删除。操作以后保存退出。

请问用到什么方法?

回复评论 (20)

循环读取文件内容,每次读1行或10行,行数随便,然后字符串查找,找到了就删除,把剩下的追加到临时文件里,最后替换原来的文件。
点赞  2010-6-2 12:34
用脚本语言处理吧,两三行代码搞定。
比如:perl
点赞  2010-6-2 12:35
fgets()一行一行读文件,一行一行处理,再把处理结构写入新文件。
完成后,关闭新,老文件。删除老文件,最后把新文件改名为老文件。
点赞  2010-6-2 12:36
几万行?
文件多大?
可以考虑用内存映射文件操作
点赞  2010-6-2 12:51
把分给我吧, 正好写过一个过滤的应用


  1. #include "stdafx.h"
  2. #include
  3. #include
  4. #pragma warning(disable:4244 4267)

  5. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  6. template struct Str_LookupA;                                                // ANSI字符集字符串查找模板
  7. template struct Str_LookupW;                                                // UNICODE 字符集字串查找模板
  8. template struct Str_Filter_Word;        // 字符串过滤模板框架 -- 只过滤输入单词
  9. template struct Str_Filter_Line;        // 字符串过滤模板框架 -- 过滤包含输入单词段落
  10. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  11. //
  12. // 模板参数 t_fMatch, 指明查找字串是否区分大小写。
  13. //                        t_fMatch = true,查找函数将不区分大小写
  14. //                        t_fMatch = false, 默认方式,按照输入查找字串进行匹配
  15. //
  16. template struct Str_LookupA
  17. {
  18.         enum { TYPE_SIZE = sizeof(CHAR)};
  19.         typedef CHAR*                _Type;
  20.         typedef const CHAR* _constType;
  21.         typedef _Type                _ReturnType;

  22.         _ReturnType operator()(_Type pSrc,_constType pSearch)
  23.         {
  24.                 return t_fMatch ? StrStrIA(pSrc,pSearch) : StrStrA(pSrc,pSearch);
  25.         }
  26.         _ReturnType LineStart(_Type pSrc,_Type pLast)
  27.         {
  28.                 _Type pStart = StrRStrIA(pSrc,pLast,"\r\n");
  29.                 return pStart ? pStart + 2 : pSrc;
  30.         }
  31.         _ReturnType LineEnd(_Type pSrc)
  32.         {
  33.                 _Type pEnd = StrStrA(pSrc,"\r\n");
  34.                 return pEnd ? pEnd + 2 : NULL;
  35.         }
  36.         DWORD Length(_constType pStr)
  37.         {
  38.                 return lstrlenA(pStr);
  39.         }
  40. };

  41. template struct Str_LookupW
  42. {
  43.         enum { TYPE_SIZE = sizeof(WCHAR)};
  44.         typedef WCHAR*                _Type;
  45.         typedef _Type                _ReturnType;
  46.         typedef const WCHAR* _constType;

  47.         _ReturnType operator()(_Type pSrc, _constType pSearch)
  48.         {
  49.                 return t_fMatch ? StrStrIW(pSrc,pSearch) : StrStrW(pSrc,pSearch);
  50.         }
  51.         _ReturnType LineStart(_Type pSrc,_Type pLast)
  52.         {
  53.                 _Type pStart = StrRStrIW(pSrc,pLast,L"\r\n");
  54.                 return pStart ? pStart + 2 : pSrc;
  55.         }
  56.         _ReturnType LineEnd(_Type pSrc)
  57.         {
  58.                 _Type pEnd = StrStrW(pSrc,L"\r\n");
  59.                 return pEnd ? pEnd + 2 : NULL;
  60.         }
  61.         DWORD Length(_constType pStr)
  62.         {
  63.                 return lstrlenW(pStr);
  64.         }

  65. };

  66. template >
  67. struct Str_Filter_Word
  68. {
  69.         typedef typename _RT::_Type                        _Type;
  70.         typedef typename _RT::_constType        _constType;
  71.         typedef typename _RT::_ReturnType        _ReturnType;

  72.         _ReturnType operator()(_Type pBuffer, DWORD cbSize, _constType *pWord, DWORD cbCount, DWORD* pcbRemoved = NULL)
  73.         {
  74.                 ATLASSERT(pBuffer && pWord && cbSize && cbCount);
  75.                 _RT Str_Lookup;
  76.                 DWORD dwRemoved = 0;
  77.                 DWORD cbStart = 0;
  78.                 DWORD cbEnd = cbSize;
  79.                 for (DWORD i = 0; i < cbCount; i++)
  80.                 {
  81.                         _Type pStart = pBuffer;
  82.                         _Type pEnd = pBuffer + cbEnd;
  83.                         _constType pSearch = pWord[i];
  84.                         DWORD cbLength = Str_Lookup.Length(pSearch);
  85.                         if (!pSearch)
  86.                                 break;
  87.                         for (;;)
  88.                         {
  89.                                 _Type p = Str_Lookup(pStart,pSearch);
  90.                                 if (!p)        break;
  91.                                 dwRemoved++;
  92.                                 _Type pNext = p + cbLength;

  93.                                 if (pNext && pNext <=pEnd)
  94.                                 {
  95.                                         cbStart = p - pBuffer;
  96.                                         memmove(p,pNext,_RT::TYPE_SIZE * (cbEnd - cbStart));
  97.                                         pStart = p;
  98.                                         cbEnd -= cbLength;
  99.                                   }
  100.                                 else
  101.                                 {
  102.                                         memset(pStart,0, _RT::TYPE_SIZE * (cbEnd - cbStart));
  103.                                         break;
  104.                                 }
  105.                         }
  106.                 }
  107.                 if (pcbRemoved) *pcbRemoved = dwRemoved;
  108.                 return pBuffer;
  109.         }

  110.         _ReturnType operator()(_Type pBuffer, DWORD cbSize, _constType pWord, DWORD* pcbRemoved = NULL)
  111.         {
  112.                 _constType pWords[] = {pWord,0};
  113.                 return operator()(pBuffer,cbSize,pWords,1,pcbRemoved);
  114.         }
  115. };

  116. template >
  117. struct Str_Filter_Line
  118. {
  119.         typedef typename _RT::_Type                        _Type;
  120.         typedef typename _RT::_constType        _constType;
  121.         typedef typename _RT::_ReturnType        _ReturnType;

  122.         _ReturnType operator()(_Type pBuffer, DWORD cbSize, _constType *pWord, DWORD cbCount, DWORD* pcbRemoved = NULL)
  123.         {
  124.                 ATLASSERT(pBuffer && pWord && cbSize && cbCount);
  125.                 _RT Str_Lookup;
  126.                 DWORD dwRemoved = 0;
  127.                 DWORD cbStart = 0;
  128.                 DWORD cbEnd = cbSize;
  129.                 for (DWORD i = 0; i < cbCount; i++)       
  130.                 {
  131.                         _Type pStart = pBuffer;
  132.                         _Type pEnd = pBuffer + cbEnd;
  133.                         _constType pSearch = pWord[i];
  134.                         if (!pSearch) break;

  135.                         for (;;)
  136.                         {
  137.                                 _Type p = Str_Lookup(pStart,pSearch);
  138.                                 if (!p)        break;

  139.                                 dwRemoved++;
  140.                                 pStart = Str_Lookup.LineStart(pBuffer,p);
  141.                                 _Type pLineEnd = Str_Lookup.LineEnd(p);
  142.                                 if (pLineEnd)
  143.                                 {
  144.                                         cbStart = pStart - pBuffer;
  145.                                         memmove(pStart,pLineEnd,_RT::TYPE_SIZE * (cbEnd - cbStart));
  146.                                         cbEnd -= (pLineEnd - pStart);
  147.                                 }
  148.                                 else
  149.                                 {
  150.                                         memset(pStart,0, _RT::TYPE_SIZE * (cbEnd - cbStart));
  151.                                         break;
  152.                                 }
  153.                         }
  154.                 }
  155.                 if (pcbRemoved) *pcbRemoved = dwRemoved;
  156.                 return pBuffer;
  157.         }

  158.         _ReturnType operator()(_Type pBuffer, DWORD cbSize, _constType pWord, DWORD* pcbRemoved = NULL)
  159.         {
  160.                 _constType pWords[] = {pWord,0};
  161.                 return operator()(pBuffer,cbSize,pWords,1,pcbRemoved);
  162.         }

  163. };

  164. HRESULT test_file_filter(LPCTSTR lpszFile, LPCSTR *pWords, DWORD cbWords, bool fLine = false)
  165. {
  166.         ATL::CAtlFileMapping map;
  167.         ATL::CAtlFile file;
  168.         HRESULT hr;

  169.         ULONGLONG uSize = 0;
  170.         if (FAILED(hr = file.Create(lpszFile,GENERIC_READ | GENERIC_WRITE,0,OPEN_EXISTING)))
  171.                 return hr;
  172.         if (FAILED(hr = file.GetSize(uSize)))
  173.                 return hr;
  174.         size_t nSize = (size_t)uSize;
  175.         if (FAILED(hr = map.MapFile(file.m_h,nSize,0,PAGE_READWRITE,FILE_MAP_READ | FILE_MAP_WRITE)))
  176.                 return hr;
  177.        
  178.         LPSTR pData = (LPSTR)map.GetData();
  179.         DWORD cbRemoved = 0;

  180.         if (fLine)
  181.         {
  182.                 // 区分大小写, 过滤包含指定单词的段落
  183.                 Str_Filter_Line<> filter;
  184.                 filter(pData,nSize,pWords,cbWords,&cbRemoved);
  185.         }
  186.         else
  187.         {
  188.                 // 以不区分大小写的模式,过滤指定单词
  189.                 Str_Filter_Word filter;
  190.                 filter(pData,nSize,pWords,cbWords,&cbRemoved);
  191.         }
  192.         printf(pData);
  193.         return S_OK;
  194. }

  195. int _tmain(int argc, _TCHAR* argv[])
  196. {

  197.         // 过滤指定文件中多个单词
  198.         LPCSTR pWords[] = {"Sec","Time","北国","sample","for",0};
  199.         HRESULT hr = test_file_filter(_T("c:\\100.txt"),pWords,5);

  200.         if (FAILED(hr))
  201.                 printf("failed! hr = 0x08X\n",hr);

  202.         // 过滤文件中包含指定单词的段落
  203.         hr = test_file_filter(_T("c:\\300.txt"),pWords,5,true);
  204.         if (FAILED(hr))
  205.                 printf("failed! hr = 0x08X\n",hr);

  206.         _getch();

  207.         return 0;
  208. }



点赞  2010-6-2 17:29
5楼的同学,我把你的代码用VC6编译,提示文件无法编译。是不是要建一个工程,要建什么类型的?
点赞  2010-6-3 12:48
建议用perl等脚本语言,几条语句就搞定了
点赞  2010-6-3 13:33
一句搞定

sed -e '/hello/p' test.c > test.c

hello替换为你要查找的单词
test.c为目标文件。
点赞  2010-6-3 13:47
测试工程师用VS2005写的。里边测试代码中用了 atlfile.h 这个头文件,这个头文件在VC7以上才有,所以你在VC6中无法编译。 过滤部分在VC6下应该能编译通过。
点赞  2010-6-3 13:48
学习拉
点赞  2010-6-3 15:16
引用: 引用 9 楼 bdzwj 的回复:
测试工程师用VS2005写的。里边测试代码中用了 atlfile.h 这个头文件,这个头文件在VC7以上才有,所以你在VC6中无法编译。 过滤部分在VC6下应该能编译通过。


那你能否编译好生成一个exe文件发给我一个,谢谢

我的目的是,把一个几万行的文本文件找出几百行需要的行,其余的删除。只要某行包含&com就留下,或者只要&txt 。。就删除
点赞  2010-6-3 16:31
sed -e '/&txt/d' filename

cat filename | grep \&com
点赞  2010-6-3 17:18
如果你使用Windows平台,建议装一个ActivePerl,处理类似的问题,极为方便。

点赞  2010-6-3 17:26
学习了
点赞  2010-6-4 10:43
问题还没有解决
点赞  2010-6-8 14:49
引用: 引用 12 楼 hzcpig 的回复:
sed -e '/&txt/d' filename

cat filename | grep \&com


这个是什么语句?dos?
点赞  2010-6-8 14:50
引用: 引用 8 楼 hzcpig 的回复:
一句搞定

sed -e '/hello/p' test.c > test.c

hello替换为你要查找的单词
test.c为目标文件。


高手啊
点赞  2010-6-8 22:30
楼上的能否解释一下该语句在什么环境下使用?
点赞  2010-6-9 08:37
额~~~抱歉,没注意到这个不是linux环境,那句是linux shell下sed工具。sed是一个专门进行行处理的工具。

不过windows下同样有 sed for windows工具。
点赞  2010-6-9 11:30
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复