[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
最好把实际数据的片段贴出来。感觉先用时间判断,再用“企业”和“退出”多重判断效率较高。

TOP

本帖最后由 qixiaobin0715 于 2023-8-23 11:36 编辑

由于审题不仔细,代码思路不对,此贴作废。
回复 14# 娜美
总感觉你提供的文本哪里有不规范的地方。比如14楼样本中的第8-13行都是“利海 B”的范围,第9行好像是多了一行“退出”。
根据时间差异进行判断。如果本行与上一行时间相同,不做任何操作;否则时间不同话,查看上一行时间后面是否是字符“退出”或“企业”,若是,不做任何操作,若不是,则按要求添加一行。
这种思路不知是否符合楼主的要求,从样本上看是这样:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1* delims=>" %%i in (a.txt) do (
  4.     if not "%%i"=="!Times!" (
  5.         for /f %%k in ("!str!") do (
  6.             if not "%%k"=="退出" (
  7.                 if not "%%k"=="企业" (
  8.                     echo,!Times!^>   退出
  9.                     echo,
  10.                 )
  11.             ) else (
  12.                 echo,
  13.             )
  14.         )
  15.     )
  16.     echo,%%i^>%%j
  17.     set "str=%%j"
  18.     set "Times=%%i"
  19. ))>b.txt
  20. pause
复制代码
代码保存为ANSI编码。未测试。

感觉上面代码还是有点不太严谨。

TOP

回复 15# 77七
应当不是这么算法,只能作为参考。比如下面代码,在我的电脑上测试,实际上用时6分多而已:
  1. @echo off
  2. (for /l %%i in (1,1,10000000) do echo,%%i)>1.txt
  3. pause
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

本帖最后由 qixiaobin0715 于 2023-8-23 11:36 编辑

由于审题不仔细,代码思路不对,此贴作废。
下面代码要比22楼要严谨些:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1* delims=>" %%i in (a.txt) do (
  4.     if not "%%i"=="!Times!" (
  5.         if not "%%j"=="!str!" (
  6.             for /f %%k in ("%%j") do (
  7.                 if "%%k"=="企业" (
  8.                     for /f %%l in ("!str!") do (
  9.                         if not "%%l"=="退出" (
  10.                             echo,!Times!^>   退出
  11.                             echo,
  12.                         ) else (
  13.                             echo,
  14.                         )
  15.                     )
  16.                 )
  17.             )
  18.         )
  19.     )
  20.     echo,%%i^>%%j
  21.     set "str=%%j"
  22.     set "Times=%%i"
  23. )
  24. for /f %%m in ("!str!") do if not "%%m"=="退出" echo,!Times!^>   退出
  25. )>b.txt
  26. pause
复制代码

TOP

这样的思路才对:
  1. @echo off
  2. set str2=退出
  3. setlocal enabledelayedexpansion
  4. (for /f "tokens=1* delims=>" %%i in (a.txt) do (
  5.     for /f %%x in ("%%j") do (
  6.         if "%%x"=="企业" (
  7.             if not "%%j"=="!str1!" (
  8.                 if not "!str2!"=="退出" (
  9.                     echo,!Times!^>   退出
  10.                     echo,
  11.                 ) else (
  12.                     if defined Times echo,
  13.                 )
  14.             )
  15.         )
  16.     )
  17.     set "Times=%%i"
  18.     echo,%%i^>%%j
  19.     for /f %%x in ("%%j") do (
  20.         if "%%x"=="企业" set "str1=%%j"
  21.         set "str2=%%x"
  22.     )
  23. )
  24. if not "!str2!"=="退出" echo,!Times!^>   退出)>b.txt
  25. pause
复制代码

TOP

换换另一个思路:
  1. @echo off
  2. set n=1
  3. setlocal enabledelayedexpansion
  4. (for /f "tokens=1* delims=>" %%i in (a.txt) do (
  5.     for /f %%x in ("%%j") do (
  6.         if "%%x"=="企业" (
  7.             if not "%%j"=="!str!" (
  8.                 if !n! equ 0 (
  9.                     echo,!Times!^>   退出
  10.                     echo,
  11.                 )
  12.             )
  13.             set n=0
  14.             set "str=%%j"
  15.         ) else if "%%x"=="退出" (
  16.             echo,%%i^>%%j
  17.             echo,
  18.             set m=0
  19.             set n=1
  20.         )
  21.     )
  22.     set "Times=%%i"
  23.     if not defined m echo,%%i^>%%j
  24.     set m=
  25. )
  26. if !n! equ 0 echo,!Times!^>   退出)>b.txt
  27. pause
复制代码

TOP

回复 33# 娜美
出现这种情况的原因见 http://www.bathome.net/thread-11193-1-1.html
但是我觉得在这里for循环体内使用setlocal和endlocal不适合,因为要兼顾到当前行上面的若干行,endlocal后,前面所有设置的变量都消失了。还是考虑其它程序或方法。

TOP

其它变量还可以想办法解决,31楼代码第22行变量Times的设置不好处理,因为你要增加的“退出”那一行,要使用上一行的时间。

TOP

本帖最后由 qixiaobin0715 于 2023-8-24 13:21 编辑

想了想,楼上说的有点太绝对,好像可以在特定位置添加setlocal和endlocal组合来实现部分特殊字符显示原样输出的问题,代码未测试:
  1. @echo off
  2. (for /f "tokens=1* delims=>" %%i in (a.txt) do (
  3.     for /f %%x in ("%%j") do (
  4.         if "%%x"=="企业" (
  5.             setlocal enabledelayedexpansion
  6.             if not "%%j"=="!str!" (
  7.                 if "!n!"=="0" (
  8.                     echo,!Times!^>   退出
  9.                     echo,
  10.                 ) else if defined n (
  11.                     echo,
  12.                 )
  13.             )
  14.             endlocal
  15.             set n=0
  16.             set "str=%%j"
  17.         ) else if "%%x"=="退出" (
  18.             set n=1
  19.         )
  20.     )
  21.     echo,%%i^>%%j
  22.     set "Times=%%i"
  23. ))>b.txt
  24. if %n% equ 0 echo,%Times%^>   退出>>b.txt
  25. pause
复制代码
请自行测试。

TOP

那是没有考虑含有“企业”的行的情况,请不要纠结这个问题了。还是以实际存在的问题为主,否则每次写代码都要面面俱到,就会出现代码复杂,效率低下的问题。

TOP

看到在12楼你有显示新增行的需求,最简单的办法是在新增行中做一个标记,比如在“退出”前面加个不常用的符号,如“`退出”,使用findstr /n命令查找这些新增行。缺点是输出结果中,新增行多出了一个符号。
以36楼的代码为例:
1.将代码第8、24行中的“退出”改为“`退出”。
2.在pause前一行增加一行代码:
  1. (for /f "delims=:" %%i in ('findstr /r /n "`退出" b.txt') do echo,%%i)>AddedLines.txt
复制代码

TOP

本帖最后由 qixiaobin0715 于 2023-8-26 09:31 编辑

回复 41# 娜美
前面让你提供真实文本,样本不典型。修改了输出样式,这样看起来更一致:
  1. @echo off
  2. (for /f "tokens=1* delims=>" %%i in (a.txt) do (
  3.     set m=
  4.     for /f %%x in ("%%j") do (
  5.         if "%%x"=="企业" (
  6.             set "str1=%%j"
  7.             setlocal enabledelayedexpansion
  8.             if not "!str1!"=="!str2!" (
  9.                 if defined n (
  10.                     echo,!Times!^>   `退出
  11.                     echo,
  12.                 )
  13.             )
  14.             endlocal
  15.             set n=0
  16.             set "str2=%%j"
  17.         ) else if "%%x"=="退出" (
  18.             set m=1
  19.             set n=
  20.         )
  21.     )
  22.     if not "%%j"=="" (echo,%%i^>%%j) else echo,%%i
  23.     if defined m echo,
  24.     set "Times=%%i"
  25. ))>b.txt
  26. if %n% equ 0 echo,%Times%^>   `退出>>b.txt
  27. (for /f "delims=:" %%i in ('findstr /r /n "`退出" b.txt') do echo,%%i)>AddedLines.txt
  28. pause
复制代码
再试试看看。

TOP

本帖最后由 qixiaobin0715 于 2023-8-26 09:48 编辑

回复 37# 娜美
实际上好好看看34楼链接的帖子,就能解决37楼的问题。
总的原则是在setlocal和endlocal之外设置变量,在其内部使用设置的变量。
33楼和37楼其实是同一类的问题,只不过前者是显示,后者是比较,所以解决的方法也类似。
我已把42楼的代码修改,看看是否能解决你的问题。

TOP

返回列表