[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何将多个文本根据第一行中的指定内容进行分类并按序输出/列举出文件名

本帖最后由 pcl_test 于 2016-9-2 19:26 编辑

【求助】如何按照文件内容重新排列文本文件并交互选择?
例如某一目录内有N多文本文件,每个文件的第一行都是单位名称=中央电视台,但是单位名称不固定,也有单位名称=人民日报这样的。现在需要做的是,将这些文本文件按照文件内第一行的单位名称来归类显示,例如这样:

单位名称=中央电视台
======================
1.文件名
2.文件名
3.文件名
......

单位名称=人民日报
======================
4.文件名
5.文件名
6.文件名
.......

单位名称=新华社
======================
7.文件名
......



并且具有交互功能,只需要输入数字序号,就可以显示该序号对应的文件内容。

以上功能该如何实现呢?

本帖最后由 pcl_test 于 2016-9-3 00:03 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /a-d/b *.txt') do (
  3.     set /p first=<"%%a"
  4.     set "first=!first: =!"
  5.     set "first=!first: =!"
  6.     if "!first:~,5!" equ "单位名称=" (
  7.         set /a m+=1
  8.         for /f "tokens=1* delims==" %%b in ("!first!") do set "#%%c|!m!=%%a"
  9.     )
  10. )
  11. :loop
  12. cls&set n=0
  13. for /f "tokens=1,2* delims=#|=" %%a in ('set #') do (
  14.     set /a n+=1
  15.     if not defined _%%a (
  16.         if !n! neq 1 echo;
  17.         echo;单位名称=%%a
  18.         echo;======================
  19.         set "_%%a=1"
  20.     )
  21.     echo;!n!、%%c
  22.     set "_!n!=%%c"
  23. )
  24. echo;
  25. set /p c=输入文件名前的序号并按回车键可查看文本内容:
  26. type "!_%c%!"
  27. rem start "" notepad "!_%c%!"
  28. echo;
  29. for /f "tokens=1* delims==" %%a in ('set _') do set "%%a="
  30. echo;^>^>按任意键返回文件列表^<^<
  31. pause>nul&goto loop
复制代码
1

评分人数

TOP

本帖最后由 DiamondbacK 于 2016-9-3 16:05 编辑
  1. @echo off & setlocal
  2. call :getTable table                                             as a string of
  3. :l1                             "index:unit name:filename:previous unit name"'s
  4. call :listFiles table
  5. :l2
  6. call :requestIndex index
  7. if /i "%index%" == "L" goto l1                                       list files
  8. call type "%%file%index%%%" && goto l2                            request again
  9. endlocal & exit /b
  10. -------------------------------------------------------------------------------
  11. :getTable
  12. set %1=
  13. for /f "tokens=1,3* delims==:" %%I in ('
  14.   (
  15.     for %%I in (*.txt^) do @(
  16.       set "firstLine=" ^&
  17.       set /p firstLine^=^<"%%I" ^&
  18.       call echo %%^^firstLine%%:%%I
  19.     ^)
  20.   ^) ^| findstr /i "^单位名称" ^| sort ^| findstr /n "."
  21. ') do (
  22.   set file%%I=%%K
  23.   call set table=%%table%% "%%I:%%J:%%K:%%prevUnitName%%"
  24.   set prevUnitName=%%J
  25. )
  26. goto :eof
  27. :listFiles
  28. for /f "tokens=1,2,3,4 delims=:" %%I in ('
  29.   for %%I in (%table%^) do @echo :%%~I:
  30. ') do (
  31.   if "%%J" neq "%%L" (
  32.     echo=& echo 单位名称=%%J
  33.     echo ===============================
  34.   )
  35.   echo %%I. %%K
  36. )
  37. goto :eof
  38. :requestIndex
  39. echo=& set %1=
  40. set /p %1=请输入文件索引号(输入"L"查看列表,无效索引自动退出):
  41. goto :eof
复制代码

TOP

有没有大神用perl或者python写一个勒!学习学习!bat不懂!
啥都不懂,啥都不会!学的还慢!

TOP

回复 4# 949825667@qq.co
  1. # encoding: gbk
  2. import os
  3. dict1={}
  4. dict2={}
  5. n=0
  6. files = os.listdir('.')
  7. for f in files:
  8.     if(f.endswith('.txt') and os.path.isfile(f)):
  9.         line = open(f, 'r').readline().strip()
  10.         if line.find('单位名称=') > -1:
  11.             if not dict1.has_key(line):
  12.                 dict1[line]=[]
  13.             dict1[line].append(f)
  14. for key in dict1:
  15.     print key+'\r\n======================'
  16.     for t in dict1[key]:
  17.         n+=1
  18.         dict2[str(n)]=t
  19.         print str(n)+'、'+t
  20.     print
  21. f = raw_input('输入文件名前的序号并按回车键可查看文本内容:')
  22. print open(dict2[f], 'r').read()
  23. #os.system('notepad "'+dict2[f]+'"')
复制代码
1

评分人数

    • 949825667@qq.co: py3.x,判断key是不是存在,可用if line no ...技术 + 1

TOP

回复 4# 949825667@qq.co


    你要的 python 来了...
  1. #coding: GB2312
  2. import os
  3. year = 1  
  4. years = 5  
  5. bj = 10000  
  6. rate = 0.05  
  7. f = open("a.bat", 'w+')  
  8. bat = """
  9. @echo off&setlocal enabledelayedexpansion
  10. for /f "delims=" %%a in ('dir /a-d/b *.txt') do (
  11.     set /p first=<"%%a"
  12.     set "first=!first: =!"
  13.     set "first=!first: =!"
  14.     if "!first:~,5!" equ "单位名称=" (
  15.         set /a m+=1
  16.         for /f "tokens=1* delims==" %%b in ("!first!") do set "#%%c|!m!=%%a"
  17.     )
  18. )
  19. for /f "tokens=1,2* delims=#|=" %%a in ('set #') do (
  20.     set /a n+=1
  21.     if not defined _%%a (
  22.         if !n! neq 1 echo;
  23.         echo;单位名称=%%a
  24.         echo;======================
  25.         set "_%%a=1"
  26.     )
  27.     echo;!n!、%%c
  28.     set "_!n!=%%c"
  29. )
  30. echo;
  31. set /p c=输入文件名前的序号并按回车键可查看文本内容:
  32. type "!_%c%!"
  33. pause
  34. """
  35. print(bat, file=f)
  36. os.system("start a.bat")
复制代码
3

评分人数

TOP

本帖最后由 pcl_test 于 2016-9-6 23:31 编辑

第三方http://www.bathome.net/s/tool/index.html?key=gawk
  1. #*&cls&(dir /a-d/b *.txt)|gawk -f "%~f0">con&pause&exit
  2. BEGIN{
  3.     while(getline>0){
  4.         f=$0;
  5.         getline<f;
  6.         gsub(/^[[:space:]]*|[[:space:]]*$/,"",$0);
  7.         if($0~/单位名称=/)a[$0]=a[$0]"|"f;
  8.     }
  9.     for(b in a){
  10.         print b"\n======================";
  11.         split(substr(a[b],2),t,"|");
  12.         for(i=1;i<=length(t);i++){
  13.             n+=1;
  14.             print n"、"t[i];
  15.         }
  16.         print ""
  17.     }
  18. }
复制代码
2

评分人数

TOP

返回列表