标题: [文本处理] 批处理如何将多个文本根据第一行中的指定内容进行分类并按序输出/列举出文件名 [打印本页]
作者: binghejin 时间: 2016-9-2 16:47 标题: 批处理如何将多个文本根据第一行中的指定内容进行分类并按序输出/列举出文件名
本帖最后由 pcl_test 于 2016-9-2 19:26 编辑
【求助】如何按照文件内容重新排列文本文件并交互选择?
例如某一目录内有N多文本文件,每个文件的第一行都是单位名称=中央电视台,但是单位名称不固定,也有单位名称=人民日报这样的。现在需要做的是,将这些文本文件按照文件内第一行的单位名称来归类显示,例如这样:
单位名称=中央电视台
======================
1.文件名
2.文件名
3.文件名
......
单位名称=人民日报
======================
4.文件名
5.文件名
6.文件名
.......
单位名称=新华社
======================
7.文件名
......
并且具有交互功能,只需要输入数字序号,就可以显示该序号对应的文件内容。
以上功能该如何实现呢?
作者: pcl_test 时间: 2016-9-2 19:32
本帖最后由 pcl_test 于 2016-9-3 00:03 编辑
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /a-d/b *.txt') do (
- set /p first=<"%%a"
- set "first=!first: =!"
- set "first=!first: =!"
- if "!first:~,5!" equ "单位名称=" (
- set /a m+=1
- for /f "tokens=1* delims==" %%b in ("!first!") do set "#%%c|!m!=%%a"
- )
- )
- :loop
- cls&set n=0
- for /f "tokens=1,2* delims=#|=" %%a in ('set #') do (
- set /a n+=1
- if not defined _%%a (
- if !n! neq 1 echo;
- echo;单位名称=%%a
- echo;======================
- set "_%%a=1"
- )
- echo;!n!、%%c
- set "_!n!=%%c"
- )
- echo;
- set /p c=输入文件名前的序号并按回车键可查看文本内容:
- type "!_%c%!"
- rem start "" notepad "!_%c%!"
- echo;
- for /f "tokens=1* delims==" %%a in ('set _') do set "%%a="
- echo;^>^>按任意键返回文件列表^<^<
- pause>nul&goto loop
复制代码
作者: DiamondbacK 时间: 2016-9-2 21:03
本帖最后由 DiamondbacK 于 2016-9-3 16:05 编辑
- @echo off & setlocal
-
- call :getTable table as a string of
- :l1 "index:unit name:filename:previous unit name"'s
- call :listFiles table
- :l2
- call :requestIndex index
- if /i "%index%" == "L" goto l1 list files
- call type "%%file%index%%%" && goto l2 request again
-
- endlocal & exit /b
- -------------------------------------------------------------------------------
-
- :getTable
- set %1=
- for /f "tokens=1,3* delims==:" %%I in ('
- (
- for %%I in (*.txt^) do @(
- set "firstLine=" ^&
- set /p firstLine^=^<"%%I" ^&
- call echo %%^^firstLine%%:%%I
- ^)
- ^) ^| findstr /i "^单位名称" ^| sort ^| findstr /n "."
- ') do (
- set file%%I=%%K
- call set table=%%table%% "%%I:%%J:%%K:%%prevUnitName%%"
- set prevUnitName=%%J
- )
- goto :eof
-
- :listFiles
- for /f "tokens=1,2,3,4 delims=:" %%I in ('
- for %%I in (%table%^) do @echo :%%~I:
- ') do (
- if "%%J" neq "%%L" (
- echo=& echo 单位名称=%%J
- echo ===============================
- )
- echo %%I. %%K
- )
- goto :eof
-
- :requestIndex
- echo=& set %1=
- set /p %1=请输入文件索引号(输入"L"查看列表,无效索引自动退出):
- goto :eof
复制代码
作者: 949825667@qq.co 时间: 2016-9-2 21:38
有没有大神用perl或者python写一个勒!学习学习!bat不懂!
作者: pcl_test 时间: 2016-9-3 00:00
回复 4# 949825667@qq.co - # encoding: gbk
- import os
- dict1={}
- dict2={}
- n=0
- files = os.listdir('.')
- for f in files:
- if(f.endswith('.txt') and os.path.isfile(f)):
- line = open(f, 'r').readline().strip()
- if line.find('单位名称=') > -1:
- if not dict1.has_key(line):
- dict1[line]=[]
- dict1[line].append(f)
- for key in dict1:
- print key+'\r\n======================'
- for t in dict1[key]:
- n+=1
- dict2[str(n)]=t
- print str(n)+'、'+t
- print
- f = raw_input('输入文件名前的序号并按回车键可查看文本内容:')
- print open(dict2[f], 'r').read()
- #os.system('notepad "'+dict2[f]+'"')
复制代码
作者: CrLf 时间: 2016-9-3 00:04
回复 4# 949825667@qq.co
你要的 python 来了...- #coding: GB2312
- import os
- year = 1
- years = 5
- bj = 10000
- rate = 0.05
- f = open("a.bat", 'w+')
- bat = """
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /a-d/b *.txt') do (
- set /p first=<"%%a"
- set "first=!first: =!"
- set "first=!first: =!"
- if "!first:~,5!" equ "单位名称=" (
- set /a m+=1
- for /f "tokens=1* delims==" %%b in ("!first!") do set "#%%c|!m!=%%a"
- )
- )
- for /f "tokens=1,2* delims=#|=" %%a in ('set #') do (
- set /a n+=1
- if not defined _%%a (
- if !n! neq 1 echo;
- echo;单位名称=%%a
- echo;======================
- set "_%%a=1"
- )
- echo;!n!、%%c
- set "_!n!=%%c"
- )
- echo;
- set /p c=输入文件名前的序号并按回车键可查看文本内容:
- type "!_%c%!"
- pause
- """
- print(bat, file=f)
- os.system("start a.bat")
复制代码
作者: pcl_test 时间: 2016-9-3 05:09
本帖最后由 pcl_test 于 2016-9-6 23:31 编辑
第三方http://www.bathome.net/s/tool/index.html?key=gawk- #*&cls&(dir /a-d/b *.txt)|gawk -f "%~f0">con&pause&exit
-
- BEGIN{
- while(getline>0){
- f=$0;
- getline<f;
- gsub(/^[[:space:]]*|[[:space:]]*$/,"",$0);
- if($0~/单位名称=/)a[$0]=a[$0]"|"f;
- }
- for(b in a){
- print b"\n======================";
- split(substr(a[b],2),t,"|");
- for(i=1;i<=length(t);i++){
- n+=1;
- print n"、"t[i];
- }
- print ""
- }
- }
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |