返回列表 发帖
本帖最后由 qixiaobin0715 于 2021-1-11 22:39 编辑

对自己的代码还不是太满意,速度慢效率低。还是等高手出来解决吧。
楼主能不能发一个完整的样本,不要节选的,便于测试。

TOP

本帖最后由 terse 于 2021-1-12 00:15 编辑

回复 11# toyerspollors
@echo off&setlocal enabledelayedexpansion
(for /f "tokens=1*delims=:" %%h in ('findstr /in .* 歌手.txt')  do (
     set "str=%%i"
     set "s=!str:~,1!"
     if !s! leq 9 for /f "tokens=* delims=0123456789" %%a in ("%%i")  do (
            set "t=!str!"
            for /l %%d in (0,1,9) do set "t=!t:%%d=!"
            if  "%%a" == "!t!" set "str=@@%%i"
    )
    echo;!str!
))>2.txt
pauseCOPY

TOP

PowerShell "$arr=(gc 1.txt) -replace '^第[一二三四五六七八九零十百]+章\s+\S', '##$&'; sc 2.txt -Value $arr"

TOP

建议把你的需求写清晰点

TOP

本帖最后由 路过 于 2021-1-12 14:59 编辑

回复 10# toyerspollors
歌手1的代码
@echo off
setlocal enabledelayedexpansion
pushd "%~sdp0"
for /f %%a in ('findstr /v "^^^$" "歌手1.txt" ^| find /c /v ""') do set line=%%a
(
    for /l %%a in (1,1,%line%) do (set "q="
        set /p q=
        if "!q!"=="" (echo;) else (
            set w=!q:~0,1!
            if "!w!"=="第" (echo;@@!q!) else (echo;!q!)
        )
    )
)<歌手1.txt>n歌手1.txt
pauseCOPY
歌手2的代码
@echo off
setlocal enabledelayedexpansion
pushd "%~sdp0"
for %%a in (一 二 三 四 五 六 七 八 九) do (set .%%a=1)
for /f %%a in ('findstr /v "^^^$" "歌手2.txt" ^| find /c /v ""') do set line=%%a
(
    for /l %%a in (1,1,%line%) do (set "q="
        set /p q=
        if "!q!"=="" (echo;) else (
            set w=!q:~0,1!
            if defined .!w! (echo;@@!q!) else (echo;!q!)
        )
    )
)<歌手2.txt>n歌手2.txt
pauseCOPY

TOP

用途不明 不好写

TOP

本帖最后由 qixiaobin0715 于 2021-1-12 22:50 编辑

这样直接分割文件效率高一点(适合顶楼的情况):
@echo off
set n=0
setlocal enabledelayedexpansion
for /f "tokens=1,2* delims=: " %%a in ('findstr /r /n /c:"^ *[0-9][0-9]* " 歌手.txt') do (
    set /a n+=1
    set str=%%a
    set /a _!n!=!str: =!
    set "#!n!=%%b %%c"
)
set /a k=%_1%-1
set m=1
for /f "skip=%k% tokens=1* delims=:" %%i in ('findstr /n ".*" 歌手.txt') do (
    set /a x=_!m!
    if !x!==%%i (
        for %%d in (#!m!) do set "filename=!%%d!.txt"
        echo,%%j>>!filename!
        set /a m+=1
    ) else (
        echo,%%j>>!filename!
    )
)
pauseCOPY

TOP

回复 22# qixiaobin0715

你这个比之前在13楼写的分割是快了很多。可惜不识别1 李玟这个空格字符。你之前在13楼写的就支持识别这种空格。

还有我发现一个问题,就是序号在每行第一个字符位置的就能识别分割,如果序号不在第一个字符位置,前面还有空格的话,就不能识别分割了。

我已把问题详细编辑到1楼了。

1   李玟
  56    尚雯婕

TOP

回复 23# toyerspollors
22楼代码已修改,可以解决分割标题前置空格问题。你提的条件越多效率就会下降的越多,建议用文本编辑器统一下格式,将全角空格替换为半角空格,再处理。

TOP

findstr判断也就那样  数字开头行 后面跟一句 还得再判断
排除了数字开头行后面超过10个字符的  字符数可自定
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1*delims=:" %%h in ('findstr /in .* ^<歌手.txt')  do (
       for /f "tokens=*" %%j in ("%%i")  do (
               if "%%j" leq "9" if "%%j" gtr "0" for /f "delims=0123456789" %%a in ("%%j")  do (
                       set "a=%%a"
                       set "t=%%j"
                       for /l %%d in (0,1,9) do set "t=!t:%%d=!"
                       if  "!a!" == "!t!" if "!a:~10!" == "" set "file=%%j.txt"
               )
       )
       if defined file >>!file! echo;%%i
)
pauseCOPY

TOP

本帖最后由 路过 于 2021-1-13 08:23 编辑

一楼要的代码
@echo off
setlocal enabledelayedexpansion
pushd "%~sdp0"
for /l %%a in (1,1,9) do (set .%%a=1)
for /f %%a in ('findstr /v "^^^$" "歌手111.txt" ^| find /c /v ""') do set line=%%a
(
    for /l %%a in (1,1,%line%) do (set "q="
        set /p q=
        if "!q!"=="" (echo;) else (
            for /f "tokens=*" %%b in ("!q!") do (set w=%%b
                set w=!w:~0,1!!w:~23,1!
                if defined .!w! (echo;@@%%b) else (echo;!q!)
            )
        )
    )
)<歌手111.txt>n歌手111.txt
pauseCOPY

TOP

本帖最后由 qixiaobin0715 于 2021-1-13 09:01 编辑

确实像楼上老大所说的那样。其实处理文本不是批处理的强项,并且到处是雷。其它功能有时倒是挺方便。编辑文本文件还不如使用文本编辑器Notepad++、EE等,效率又高又容易操控。比如像本帖,用文本编辑器用一个简单的正则表达式就能解决问题:
打开替换选项卡——勾选使用正则表达式——搜索项填入:
^\s*([0-9一二三四五六七八九零十百第章]+[  ])COPY
或更精确一点:
^\s*(([0-9]+|第?[一二三四五六七八九零十百]+章?)[  ])COPY
替换项填入:
@@\1COPY
点击替换全部即可

TOP

回复 27# qixiaobin0715


我还没有用过这样文本编辑器处理文本,过后尝试一下, 谢谢老师指点。

TOP

谢谢各位老师指教。

本贴到此结束,过后慢慢消化学习。

TOP

返回列表