求个文本处理的批处理脚本代码,谁帮写一下?
有1.txt文件里面内容为(12345)fsdf646546(23)(12345)(23)(12345)(12345)4654545(12345)(12)(1)(23)要...
有1.txt文件
里面内容为
(12345)fsdf646546(23) (12345)(23)(12345)
(12345)4654545(12345)(12)(1)(23)
要求运行后得到2.txt
(12345)--5
(23)--3
(12)--1
(1)--1
,只要是有()的内容就要识别比较,出现次数多的排在前面,并输出出现的次数。找一朋友写了一个,是 这样的:
@echo off
setlocal enabledelayedexpansion
set a=0
for /f "tokens=1-20 delims=(" %%a in (1.txt) do (
if not "%%a"=="" call :i %%a
if not "%%b"=="" call :i %%b
if not "%%c"=="" call :i %%c
if not "%%d"=="" call :i %%d
if not "%%e"=="" call :i %%e
if not "%%f"=="" call :i %%f
if not "%%g"=="" call :i %%g
if not "%%h"=="" call :i %%h
if not "%%i"=="" call :i %%i
if not "%%j"=="" call :i %%j
if not "%%k"=="" call :i %%k
if not "%%l"=="" call :i %%l
if not "%%m"=="" call :i %%m
if not "%%n"=="" call :i %%n
if not "%%o"=="" call :i %%o
if not "%%p"=="" call :i %%p
if not "%%q"=="" call :i %%q
if not "%%r"=="" call :i %%r
if not "%%s"=="" call :i %%s
if not "%%t"=="" call :i %%t
)
set b=0
set d=0
:a
set /a b+=1
set c=!a%b%!
if "!c%c%!"=="" (set c%c%=1&set /a d+=1&set b!d!=%c%) else (set /a c%c%+=1)
if not %b%==%a% goto a
set b=0
if exist tmp rd /s /q tmp
md tmp\
cd tmp\
:b
set /a b+=1
set c=!b%b%!
for /l %%i in (1,1,!c%c%!) do (echo.a>>%c%)
if not %b%==%d% goto b
set /a b+=1
for /f "tokens=*" %%i in ('dir /o:s /b') do (
set /a b-=1
set d!b!=%%i
)
cd..
rd /s /q tmp\
for /l %%i in (%b%,1,%d%) do (
call :c %%i
)
exit
:i
set /a a+=1
for /f "tokens=1 delims=)" %%a in ('echo.%1') do (
set a%a%=%%a
)
goto :eof
:c
set c=!d%1!
echo (%c%)--!c%c%!>>2.txt
goto :eof
但是文本稍大一点就不行了,我复制了很多
(中国)fsdf646546(人) (中国)(人)(的)
(中国)4654545(中国)(人)(一)(的)(中国)fsdf646546(人)
文本还不到100k,脚本根本处理不了,希望有高手能帮写出更高效的代码。谢谢~! 展开
里面内容为
(12345)fsdf646546(23) (12345)(23)(12345)
(12345)4654545(12345)(12)(1)(23)
要求运行后得到2.txt
(12345)--5
(23)--3
(12)--1
(1)--1
,只要是有()的内容就要识别比较,出现次数多的排在前面,并输出出现的次数。找一朋友写了一个,是 这样的:
@echo off
setlocal enabledelayedexpansion
set a=0
for /f "tokens=1-20 delims=(" %%a in (1.txt) do (
if not "%%a"=="" call :i %%a
if not "%%b"=="" call :i %%b
if not "%%c"=="" call :i %%c
if not "%%d"=="" call :i %%d
if not "%%e"=="" call :i %%e
if not "%%f"=="" call :i %%f
if not "%%g"=="" call :i %%g
if not "%%h"=="" call :i %%h
if not "%%i"=="" call :i %%i
if not "%%j"=="" call :i %%j
if not "%%k"=="" call :i %%k
if not "%%l"=="" call :i %%l
if not "%%m"=="" call :i %%m
if not "%%n"=="" call :i %%n
if not "%%o"=="" call :i %%o
if not "%%p"=="" call :i %%p
if not "%%q"=="" call :i %%q
if not "%%r"=="" call :i %%r
if not "%%s"=="" call :i %%s
if not "%%t"=="" call :i %%t
)
set b=0
set d=0
:a
set /a b+=1
set c=!a%b%!
if "!c%c%!"=="" (set c%c%=1&set /a d+=1&set b!d!=%c%) else (set /a c%c%+=1)
if not %b%==%a% goto a
set b=0
if exist tmp rd /s /q tmp
md tmp\
cd tmp\
:b
set /a b+=1
set c=!b%b%!
for /l %%i in (1,1,!c%c%!) do (echo.a>>%c%)
if not %b%==%d% goto b
set /a b+=1
for /f "tokens=*" %%i in ('dir /o:s /b') do (
set /a b-=1
set d!b!=%%i
)
cd..
rd /s /q tmp\
for /l %%i in (%b%,1,%d%) do (
call :c %%i
)
exit
:i
set /a a+=1
for /f "tokens=1 delims=)" %%a in ('echo.%1') do (
set a%a%=%%a
)
goto :eof
:c
set c=!d%1!
echo (%c%)--!c%c%!>>2.txt
goto :eof
但是文本稍大一点就不行了,我复制了很多
(中国)fsdf646546(人) (中国)(人)(的)
(中国)4654545(中国)(人)(一)(的)(中国)fsdf646546(人)
文本还不到100k,脚本根本处理不了,希望有高手能帮写出更高效的代码。谢谢~! 展开
3个回答
展开全部
我花了很长时间给你写了一个批处理,要的话HI我,不过我要求再追加50分...
给不给看你啦。。。
@echo off & setlocal enabledelayedexpansion & COLOR 2 & CHCP 936
CLS
:BF
ECHO 请先将源文件改为"1.TXT"
ECHO 再单独新建一个文件夹,将本程序与源文件复制到其中执行,否则可能会造成误删文件!!!
ECHO 在程序使用过程中不要试图打开生成的文件,否则可能会造成数据丢失!!!
:_1
SET COUNT=0
:_2
ECHO 正在备份文件...
MD BACKUP & COPY * BACKUP
:_31
SET NUM=0 & SET BF=0
ECHO 输入(XXX)中的XXX的最多个数...(只大不小)
ECHO 比如文档内容为:(AA)(BB)(AA)(CC),算两个,最好输入"3"...
ECHO 如果最后你发现统计少了,可能是这个值小了...
ECHO [即任何个数多于这个值的字符串都不被统计]
SET /P MAX=Enter:
IF NOT %MAX% LSS 10000 (ECHO 数据很大,请耐心等待...)
ECHO 输入文档中每行()的最大个数...(只大不小)
ECHO 比如文档内容为:(XX)(XX)(XX)
ECHO (XX)(XX)
ECHO (XX)(XX)(XX)(XX)(XX)
ECHO 算5个,最好输入"6"...
SET /P MIN=Enter:
CLS
ECHO 正在做准备工作...(共%MAX%次)
:_32
SET /A BF+=1
ECHO NOTDEFINED>>TEMP.DAT & SET /A NUM+=1
IF %NUM% EQU %MAX% (GOTO WORK)
GOTO _32
:WORK
CLS
SET /A COUNT+=1
ECHO 正在做第一步处理...(共%MIN%次)
ECHO 第%COUNT%次...
:P1
ECHO P1
SET NUM=0
(FOR /F "tokens=* delims=" %%I in (1.txt) do (SET /A NUM+=1
ECHO !NUM!.%%I))>_1.TXT
MOVE _1.TXT 1.TXT
:P2
ECHO P2
SET NUM=0
(for /f "tokens=1,* delims=(" %%I in (1.txt) do (ECHO %%J
)
)>_1.TXT
MOVE _1.TXT 1.TXT
:P3
ECHO P3
for /f "tokens=1,* delims=)" %%I in (1.txt) do (ECHO %%I>>"%%I.TXT"
ECHO %%J>>_1.TXT
)
MOVE _1.TXT 1.TXT
:P4
ECHO P4
SET CHOICE=
IF %COUNT% LSS %MIN% (GOTO WORK) ELSE (CLS
ECHO 查看文件是否全部被转化为"处于关闭状态。"
PAUSE
START "" "1.TXT"
ECHO ---------------------------------[Y/N][大写]
SET /P CHOICE=Enter:
IF !CHOICE! EQU Y (GOTO P5) ELSE (ECHO 自动增加一次...
SET /A COUNT-=1 & GOTO WORK)
)
:P5
DEL "1.TXT" "ECHO 处于关闭状态。.TXT" "_1.TXT"
:P6
ECHO 正在做第二步处理...
FOR %%A IN (*.TXT) DO (SET NAME1=%%A
SET NAME2=!NAME1:~,-4!
ECHO 正在处理"!NAME2!"
SET NUM=0
FOR /F "TOKENS=*" %%I IN (!NAME1!) DO (SET /A NUM+=1)
SET /A OP=%MAX%-!NUM!
IF !OP! LSS 1 (ECHO !NAME2! ---!NUM!>>YICHU.DAT)
SET COUNT=0
(FOR /F "TOKENS=*" %%I IN (TEMP.DAT) DO (SET /A COUNT+=1
IF !COUNT! EQU !OP! (ECHO !NAME2! --!NUM! %%I) ELSE (ECHO %%I NOTDEFINED)
))>_TEMP.DAT
MOVE _TEMP.DAT TEMP.DAT
)
:P7
CLS
ECHO 正在做第三步处理...
(FOR /F "TOKENS=*" %%I IN (TEMP.DAT) DO (SET STR=%%I
SET STR=!STR:NOTDEFINED=!
ECHO !STR!))>_TEMP.DAT
MOVE _TEMP.DAT TEMP.DAT
:P8
CLS
SET NUM=0
SET SL=0
FOR /F "TOKENS=* DELIMS=" %%I IN (TEMP.DAT) DO (SET /A SL+=1)
ECHO 正在做第四步处理...[共%SL%次][可能会花大量时间]
FOR /F "TOKENS=*" %%I IN (TEMP.DAT) DO (SET STR=%%I
SET STR=!STR:ECHO 处于关闭状态。=0x!
ECHO !STR!>>_TEMP.DAT
)
MOVE _TEMP.DAT TEMP.DAT
FOR /F "TOKENS=*" %%I IN (TEMP.DAT) DO (SET STR=%%I
IF NOT "!STR!" == "0x" (ECHO !STR!>>_TEMP.DAT)
)
MOVE _TEMP.DAT TEMP.DAT
:P9
CLS
ECHO 正在做收尾工作...
DEL *.TXT
:P10
REN TEMP.DAT 2.TXT
REN YICHU.DAT 溢出.TXT
:END
CLS
ECHO 正在打开目标文件...
START "" "2.TXT"
EXIT
给不给看你啦。。。
@echo off & setlocal enabledelayedexpansion & COLOR 2 & CHCP 936
CLS
:BF
ECHO 请先将源文件改为"1.TXT"
ECHO 再单独新建一个文件夹,将本程序与源文件复制到其中执行,否则可能会造成误删文件!!!
ECHO 在程序使用过程中不要试图打开生成的文件,否则可能会造成数据丢失!!!
:_1
SET COUNT=0
:_2
ECHO 正在备份文件...
MD BACKUP & COPY * BACKUP
:_31
SET NUM=0 & SET BF=0
ECHO 输入(XXX)中的XXX的最多个数...(只大不小)
ECHO 比如文档内容为:(AA)(BB)(AA)(CC),算两个,最好输入"3"...
ECHO 如果最后你发现统计少了,可能是这个值小了...
ECHO [即任何个数多于这个值的字符串都不被统计]
SET /P MAX=Enter:
IF NOT %MAX% LSS 10000 (ECHO 数据很大,请耐心等待...)
ECHO 输入文档中每行()的最大个数...(只大不小)
ECHO 比如文档内容为:(XX)(XX)(XX)
ECHO (XX)(XX)
ECHO (XX)(XX)(XX)(XX)(XX)
ECHO 算5个,最好输入"6"...
SET /P MIN=Enter:
CLS
ECHO 正在做准备工作...(共%MAX%次)
:_32
SET /A BF+=1
ECHO NOTDEFINED>>TEMP.DAT & SET /A NUM+=1
IF %NUM% EQU %MAX% (GOTO WORK)
GOTO _32
:WORK
CLS
SET /A COUNT+=1
ECHO 正在做第一步处理...(共%MIN%次)
ECHO 第%COUNT%次...
:P1
ECHO P1
SET NUM=0
(FOR /F "tokens=* delims=" %%I in (1.txt) do (SET /A NUM+=1
ECHO !NUM!.%%I))>_1.TXT
MOVE _1.TXT 1.TXT
:P2
ECHO P2
SET NUM=0
(for /f "tokens=1,* delims=(" %%I in (1.txt) do (ECHO %%J
)
)>_1.TXT
MOVE _1.TXT 1.TXT
:P3
ECHO P3
for /f "tokens=1,* delims=)" %%I in (1.txt) do (ECHO %%I>>"%%I.TXT"
ECHO %%J>>_1.TXT
)
MOVE _1.TXT 1.TXT
:P4
ECHO P4
SET CHOICE=
IF %COUNT% LSS %MIN% (GOTO WORK) ELSE (CLS
ECHO 查看文件是否全部被转化为"处于关闭状态。"
PAUSE
START "" "1.TXT"
ECHO ---------------------------------[Y/N][大写]
SET /P CHOICE=Enter:
IF !CHOICE! EQU Y (GOTO P5) ELSE (ECHO 自动增加一次...
SET /A COUNT-=1 & GOTO WORK)
)
:P5
DEL "1.TXT" "ECHO 处于关闭状态。.TXT" "_1.TXT"
:P6
ECHO 正在做第二步处理...
FOR %%A IN (*.TXT) DO (SET NAME1=%%A
SET NAME2=!NAME1:~,-4!
ECHO 正在处理"!NAME2!"
SET NUM=0
FOR /F "TOKENS=*" %%I IN (!NAME1!) DO (SET /A NUM+=1)
SET /A OP=%MAX%-!NUM!
IF !OP! LSS 1 (ECHO !NAME2! ---!NUM!>>YICHU.DAT)
SET COUNT=0
(FOR /F "TOKENS=*" %%I IN (TEMP.DAT) DO (SET /A COUNT+=1
IF !COUNT! EQU !OP! (ECHO !NAME2! --!NUM! %%I) ELSE (ECHO %%I NOTDEFINED)
))>_TEMP.DAT
MOVE _TEMP.DAT TEMP.DAT
)
:P7
CLS
ECHO 正在做第三步处理...
(FOR /F "TOKENS=*" %%I IN (TEMP.DAT) DO (SET STR=%%I
SET STR=!STR:NOTDEFINED=!
ECHO !STR!))>_TEMP.DAT
MOVE _TEMP.DAT TEMP.DAT
:P8
CLS
SET NUM=0
SET SL=0
FOR /F "TOKENS=* DELIMS=" %%I IN (TEMP.DAT) DO (SET /A SL+=1)
ECHO 正在做第四步处理...[共%SL%次][可能会花大量时间]
FOR /F "TOKENS=*" %%I IN (TEMP.DAT) DO (SET STR=%%I
SET STR=!STR:ECHO 处于关闭状态。=0x!
ECHO !STR!>>_TEMP.DAT
)
MOVE _TEMP.DAT TEMP.DAT
FOR /F "TOKENS=*" %%I IN (TEMP.DAT) DO (SET STR=%%I
IF NOT "!STR!" == "0x" (ECHO !STR!>>_TEMP.DAT)
)
MOVE _TEMP.DAT TEMP.DAT
:P9
CLS
ECHO 正在做收尾工作...
DEL *.TXT
:P10
REN TEMP.DAT 2.TXT
REN YICHU.DAT 溢出.TXT
:END
CLS
ECHO 正在打开目标文件...
START "" "2.TXT"
EXIT
展开全部
思路基本与楼上一样,只是我习惯用一个第三方工具wfr来替换。
百度搜索 “白杨的原创免费作品”,找到wide find - replace,下载wfr.rar把wfr.exe解压到c:\windows\system32下(或解到批处理所在文件夹也行)
@echo off
setlocal enabledelayedexpansion
type 1.txt>temp.txt
wfr temp.txt -r:"(" -t:"\r\n☆"
wfr temp.txt -r:")" -t:"☆\r\n"
for /f "delims=☆" %%i in ('findstr /b ☆ temp.txt') do set /a #%%i+=1
(for /f "tokens=1,2 delims=#=" %%i in ('set #') do echo %%j--%%i)>temp.txt
(for /f "tokens=1,2 delims=-" %%i in ('sort /r temp.txt') do echo %%j--%%i)>2.txt
del temp.txt
百度搜索 “白杨的原创免费作品”,找到wide find - replace,下载wfr.rar把wfr.exe解压到c:\windows\system32下(或解到批处理所在文件夹也行)
@echo off
setlocal enabledelayedexpansion
type 1.txt>temp.txt
wfr temp.txt -r:"(" -t:"\r\n☆"
wfr temp.txt -r:")" -t:"☆\r\n"
for /f "delims=☆" %%i in ('findstr /b ☆ temp.txt') do set /a #%%i+=1
(for /f "tokens=1,2 delims=#=" %%i in ('set #') do echo %%j--%%i)>temp.txt
(for /f "tokens=1,2 delims=-" %%i in ('sort /r temp.txt') do echo %%j--%%i)>2.txt
del temp.txt
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
@echo off&setlocal enabledelayedexpansion
set hh=^
for %%h in ("!hh!") do (
for /f "delims=" %%a in (1.txt) do (
set str=%%a
set str=!str:(=%%~h(!
for /f "delims=" %%b in ("!str:)=)%%~h!") do (
set "str=%%~b"
if "!str:~,1!!str:~-1!"=="()" set /a "%%b+=1"
)
)
)
)
for /f "tokens=1,2 delims==_" %%a in ('set (') do (
set "_%%a="
set n=0000%%b
for %%z in (0!n:~-4!) do set "%%z=!%%z! "%%a""
)
for /f "tokens=1,* delims==" %%a in ('set 0^|sort /r') do (
for /f "tokens=* delims=0" %%c in ("%%a") do (
for %%d in (%%b) do echo %%~d-%%c
)
)
pause
set hh=^
for %%h in ("!hh!") do (
for /f "delims=" %%a in (1.txt) do (
set str=%%a
set str=!str:(=%%~h(!
for /f "delims=" %%b in ("!str:)=)%%~h!") do (
set "str=%%~b"
if "!str:~,1!!str:~-1!"=="()" set /a "%%b+=1"
)
)
)
)
for /f "tokens=1,2 delims==_" %%a in ('set (') do (
set "_%%a="
set n=0000%%b
for %%z in (0!n:~-4!) do set "%%z=!%%z! "%%a""
)
for /f "tokens=1,* delims==" %%a in ('set 0^|sort /r') do (
for /f "tokens=* delims=0" %%c in ("%%a") do (
for %%d in (%%b) do echo %%~d-%%c
)
)
pause
追问
要求运行后得到2.txt
你的代码没有输出到2.txt,麻烦继续完善,谢谢咯~!
还出现错误提示:
环境变量(没有定义
环境变量0没有定义
请按任意键继续。。。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询