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

[文本处理] 批处理怎样按条件插入行填补行?

本帖最后由 娜美 于 2023-8-20 14:04 编辑

补充一些a文本
  1. a.txt  ANSI编码
  2. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  3. 19:37:31 August 16 2023>   ++++
  4. 19:37:32 August 16 2023>   企业 名称:利海 B
  5. 19:37:33 August 16 2023>    +
  6. 19:37:34 August 16 2023>   企业 名称:利海 01:C (A)
  7. 19:37:35 August 16 2023>   +
  8. 19:37:36 August 16 2023>   企业 名称:海
  9. 19:37:39 August 16 2023>   退出
  10. 20:37:30 August 16 2023>   企业 名称:利海 B
  11. 20:39:30 August 16 2023>   企业 名称:利海 B
  12. 20:38:31 August 16 2023>   退出
  13. 20:37:30 August 16 2023>   企业 名称:利
  14. 20:39:30 August 16 2023>   +
  15. 20:39:30 August 16 2023>   +
  16. 20:39:30 August 16 2023>   +
  17. 20:39:30 August 16 2023>   退出
  18. 20:39:30 August 16 2023>   企业 名称:利海 B
  19. 20:38:31 August 16 2023>   退出
  20. 企业"字段 至 "企业"字段 之间 或许会有很多行,  示例中只是尽量缩短没影响的行
  21. if 如果遇到有"企业"字段 与 "企业"字段 之间的名称不相同,  且它们中间没有 "退出"字段, 则需要添加插入 "退出"字段行,  如果他们字段之间有了 "退出"字段, 则跳过忽略,  日期时间填补请使用有"企业"字段的上一行日期时间
  22. if 如果有"企业"字段的行  一直至有 "退出"字段行中, 它们名称仍然都是相同的,  ,  则不做任何动作
  23. 名称有可能会使用某些字符号,    希望可尽量支持多些名称字符
  24. PowerShell  awk bat
  25. 或许 可以将 ">"  看成分隔符处理吧
  26. >b.txt
  27. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  28. 19:37:31 August 16 2023>   ++++
  29. 19:37:31 August 16 2023>   退出
  30. 19:37:32 August 16 2023>   企业 名称:利海 B
  31. 19:37:33 August 16 2023>    +
  32. 19:37:33 August 16 2023>    退出
  33. 19:37:34 August 16 2023>   企业 名称:利海 01:C (A)
  34. 19:37:35 August 16 2023>   +
  35. 19:37:35 August 16 2023>   退出
  36. 19:37:36 August 16 2023>   企业 名称:海
  37. 19:37:39 August 16 2023>   退出
  38. 20:37:30 August 16 2023>   企业 名称:利海 B
  39. 20:39:30 August 16 2023>   企业 名称:利海 B
  40. 20:38:31 August 16 2023>   退出
  41. 20:37:30 August 16 2023>   企业 名称:利
  42. 20:39:30 August 16 2023>   +
  43. 20:39:30 August 16 2023>   +
  44. 20:39:30 August 16 2023>   +
  45. 20:39:30 August 16 2023>   退出
  46. 20:39:30 August 16 2023>   企业 名称:利海 B
  47. 20:38:31 August 16 2023>   退出
复制代码

a.txt
  1. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  2. 19:37:32 August 16 2023>   企业 名称:利海 B
  3. 19:37:34 August 16 2023>   企业 名称:利海 01:C (A)
  4. 19:37:36 August 16 2023>   企业 名称:利海 B
  5. 19:37:39 August 16 2023>   退出
  6. 20:37:30 August 16 2023>   企业 名称:利海 B
  7. 20:39:30 August 16 2023>   企业 名称:利海 B
  8. 20:38:31 August 16 2023>   退出
复制代码


执行
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "useback tokens=1* delims=:" %%f in (`findstr /n .* "a.txt"`) do (
  4. for /f "tokens=1* delims=>" %%a in ("%%g") do (
  5. if defined name (
  6. if "!name!" neq "%%b" (
  7. if "%%b" neq "   退出 " (
  8. echo !t!^>   退出
  9. set name=%%b
  10. ) else set name=
  11. )
  12. ) else set name=%%b
  13. set t=%%a
  14. )
  15. echo=%%g
  16. ))>b.txt
  17. endlocal
  18. pause
复制代码


b.txt
  1. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  2. 19:37:30 August 16 2023>   退出
  3. 19:37:32 August 16 2023>   企业 名称:利海 B
  4. 19:37:32 August 16 2023>   退出
  5. 19:37:34 August 16 2023>   企业 名称:利海 01:C (A)
  6. 19:37:34 August 16 2023>   退出
  7. 19:37:36 August 16 2023>   企业 名称:利海 B
  8. 19:37:39 August 16 2023>   退出
  9. 20:37:30 August 16 2023>   企业 名称:利海 B
  10. 20:39:30 August 16 2023>   企业 名称:利海 B
  11. 20:38:31 August 16 2023>   退出
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 娜美 于 2023-8-19 23:42 编辑

回复 2# 77七

字段与字段之间行数不固定哦,  字段与字段之间 没有"退出" 补一行就行,  似乎补多了
  1. 如果中间行数多几行情况
  2. a.txt
  3. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  4. 19:37:31 August 16 2023>   ++++
  5. 19:37:31 August 16 2023> ++++
  6. 19:37:31 August 16 2023> ++++
  7. 19:37:32 August 16 2023>   企业 名称:利海 B
  8. 19:37:33 August 16 2023>    +
  9. 如果"企业" 与 "企业"字段之间没有"退出" 字段,  在有"企业"字段上一行添加一行就行,   似乎在企业下面也添加了,   重复添加了
  10. >b.txt
  11. 19:37:30 August 16 2023> 企业 名称:优 美 利 A
  12. 19:37:30 August 16 2023>   退出
  13. 19:37:31 August 16 2023> ++++
  14. 19:37:31 August 16 2023> ++++
  15. 19:37:31 August 16 2023> ++++
  16. 19:37:31 August 16 2023>   退出
  17. 19:37:32 August 16 2023> 企业 名称:利海 B
  18. 19:37:32 August 16 2023>   退出
  19. 19:37:33 August 16 2023> +
复制代码

TOP

回复 3# 娜美


   提供的样本需要保持原样,我用2楼中a.txt测试没问题。请提供一个测试出现问题的样本,看看问题出现在哪里。
bat小白,请多指教!谢谢!

TOP

本帖最后由 娜美 于 2023-8-20 00:00 编辑

回复 4# 77七

好的
   例如这样的样例
  1. a.txt
  2. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  3. 19:37:31 August 16 2023>   ++++
  4. 19:37:31 August 16 2023>   ++++
  5. 19:37:31 August 16 2023>   ++++
  6. 19:37:31 August 16 2023>   ++++
  7. 19:37:31 August 16 2023>   ++++
  8. 19:37:32 August 16 2023>   企业 名称:利海 B
  9. 19:37:33 August 16 2023>    +
  10. 19:37:33 August 16 2023>    +
  11. 19:37:33 August 16 2023>    +
  12. 19:37:33 August 16 2023>    +
  13. 19:37:33 August 16 2023>    +
  14. 19:37:34 August 16 2023>   企业 名称:利海 01:C (A)
  15. 19:37:35 August 16 2023>   +
  16. 19:37:35 August 16 2023>   +
  17. 19:37:35 August 16 2023>   +
  18. 19:37:35 August 16 2023>   +
  19. 19:37:35 August 16 2023>   +
  20. 19:37:36 August 16 2023>   企业 名称:利海 B
  21. 20:37:30 August 16 2023>   +
  22. 20:37:30 August 16 2023>   +
  23. 20:37:30 August 16 2023>   企业 名称:利海 B
  24. 20:39:30 August 16 2023>   +
  25. 20:39:30 August 16 2023>   +
  26. 20:39:30 August 16 2023>   +
  27. 20:39:30 August 16 2023>   企业 名称:利海 B
  28. 20:38:31 August 16 2023>   退出
  29. >b.txt
  30. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  31. 19:37:31 August 16 2023>   ++++
  32. 19:37:31 August 16 2023>   ++++
  33. 19:37:31 August 16 2023>   ++++
  34. 19:37:31 August 16 2023>   ++++
  35. 19:37:31 August 16 2023>   ++++
  36. 19:37:31 August 16 2023>   退出
  37. 19:37:32 August 16 2023>   企业 名称:利海 B
  38. 19:37:33 August 16 2023>    +
  39. 19:37:33 August 16 2023>    +
  40. 19:37:33 August 16 2023>    +
  41. 19:37:33 August 16 2023>    +
  42. 19:37:33 August 16 2023>    +
  43. 19:37:33 August 16 2023>    退出
  44. 19:37:34 August 16 2023>   企业 名称:利海 01:C (A)
  45. 19:37:35 August 16 2023>   +
  46. 19:37:35 August 16 2023>   +
  47. 19:37:35 August 16 2023>   +
  48. 19:37:35 August 16 2023>   +
  49. 19:37:35 August 16 2023>   +
  50. 19:37:35 August 16 2023>   退出
  51. 19:37:36 August 16 2023>   企业 名称:利海 B
  52. 20:37:30 August 16 2023>   +
  53. 20:37:30 August 16 2023>   +
  54. 20:37:30 August 16 2023>   企业 名称:利海 B
  55. 20:39:30 August 16 2023>   +
  56. 20:39:30 August 16 2023>   +
  57. 20:39:30 August 16 2023>   +
  58. 20:39:30 August 16 2023>   企业 名称:利海 B
  59. 20:38:31 August 16 2023>   退出
复制代码

TOP

本帖最后由 77七 于 2023-8-20 00:08 编辑

回复 5# 娜美


  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "useback tokens=1* delims=:" %%f in (`findstr /n .* "a.txt"`) do (
  4. set str=%%g
  5. set str1=!str:企业=!
  6. if "!str1:退出=!" neq "!str!" (
  7. for /f "tokens=1* delims=>" %%a in ("%%g") do (
  8. if defined name (
  9. if "!name!" neq "%%b" (
  10. if "%%b" neq "   退出 " (
  11. echo !t!^>   退出
  12. set name=%%b
  13. ) else set name=
  14. )
  15. ) else set name=%%b
  16. set t=%%a
  17. )
  18. )
  19. echo=%%g
  20. ))>b.txt
  21. endlocal
  22. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 娜美 于 2023-8-20 00:24 编辑

回复 6# 77七


   这次基本对了,   不过补的时间不是上一行时间,  只是时间补错了  会寻致下一步不能正确计算时间        请帮忙再看下

TOP

回复 7# 娜美


  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "useback tokens=1* delims=:" %%f in (`findstr /n .* "a.txt"`) do (
  4. set str=%%g
  5. set str1=!str:企业=!
  6. if "!str1:退出=!" neq "!str!" (
  7. for /f "tokens=1* delims=>" %%a in ("%%g") do (
  8. if defined name (
  9. if "!name!" neq "%%b" (
  10. if "%%b" neq "   退出 " (
  11. echo !t!^>   退出
  12. set name=%%b
  13. ) else set name=
  14. )
  15. ) else set name=%%b
  16. )
  17. )
  18. for /f "tokens=1* delims=>" %%a in ("%%g") do (
  19. set t=%%a
  20. )
  21. echo=%%g
  22. ))>b.txt
  23. endlocal
  24. pause
复制代码
修改时忘记考虑了。
bat小白,请多指教!谢谢!

TOP

回复 8# 77七


   多谢哥哥基本正确了,   晚安       我明天再细试一下     
    哥哥晚安

TOP

本帖最后由 Nsqs 于 2023-8-20 07:48 编辑

ps没那么复杂
  1. $data=gc a.txt
  2. $s=New-Object 'System.Collections.Generic.List[string][]' 3
  3. $f='企业'
  4. for($i=0;$i -lt $data.Count;$i++){
  5.     if($data[$i] -match $f){
  6.         [int]$c=$c%2+1
  7.         $s[$c]=[regex]::Matches($data[$i],"$f.+")
  8.         if($s[1] -ne $s[2]){
  9.             $b=$data[$i-1]
  10.             $data[$i-1]="$($b)`r`n$([regex]::Matches($b,'.+>'))   退出"
  11.         }
  12.     }
  13. }
  14. $data=$data -split '\r\n'
  15. $data[0..($data.Count-2)]>b.txt
复制代码
bat
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=100
  3. for /f "delims=" %%1 in (a.txt)do set /a n+=1&call set "#%%n%%=%%1"
  4. for /f "tokens=1,2,6* delims=#= " %%1 in ('set #')do (
  5. set /a a=%%1
  6. set "line=%%3%%4%%5"
  7. set d=!line:*   =!
  8. set d=!d:~,2!
  9. if !d!==企业 (
  10. call set "s!c!=!line!"
  11. set /a c=c %% 2+1
  12. if !s1! neq !s2! (
  13. set /a b=a-1
  14. call set "#!b!#=%%#!b!:+=%%退出"
  15. )))
  16. (for /f "tokens=2* delims==" %%1 in ('set #')do echo %%1)>b1.txt
复制代码

TOP

本帖最后由 娜美 于 2023-8-20 09:06 编辑

回复 10# Nsqs


   PS 较为理想,  但是在实际文本中会在第一行产生多余的一行 "   退出 "   其他的还产生重复插入字段情况
例如, 以下这种情况在样式例子中不会,  但在实际文本中会发生如下情况,  多了一行
  1. a.txt
  2. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  3. 19:37:31 August 16 2023>   ++++
  4. 19:37:31 August 16 2023>   ++++
  5. 19:37:31 August 16 2023>   ++++
  6. 19:37:31 August 16 2023>   ++++
  7. 19:37:31 August 16 2023>   ++++
  8. 19:37:31 August 16 2023>   退出
  9. 19:37:32 August 16 2023>   企业 名称:海
  10. 像这种已存在条件情况,  也会重复插入了
  11. >b.txt
  12. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  13. 19:37:31 August 16 2023>   ++++
  14. 19:37:31 August 16 2023>   ++++
  15. 19:37:31 August 16 2023>   ++++
  16. 19:37:31 August 16 2023>   ++++
  17. 19:37:31 August 16 2023>   ++++
  18. 19:37:31 August 16 2023>   退出
  19. 19:37:31 August 16 2023>   退出
  20. 19:37:32 August 16 2023>   企业 名称:海
复制代码
最好能在完成后记录可以显示在那些行号插入字段变动
例如: 10,115,119,212行

TOP

本帖最后由 娜美 于 2023-8-20 09:18 编辑

回复 8# 77七


    试了100mb文件,  似乎好慢,  不知道还能加快不
最好能在完成后记录可以显示在那些行号插入字段变动
例如: 10,115,119,212行

TOP

最好把实际数据的片段贴出来。感觉先用时间判断,再用“企业”和“退出”多重判断效率较高。

TOP

本帖最后由 娜美 于 2023-8-20 10:30 编辑

回复 13# qixiaobin0715

实际数据就是5楼加上11楼数据,,, 只不过1楼举例没有足够的多, 在5楼,   11楼添加另外情况,  事实上都差不多

主要这2个条件判断呗,    耍检查有"企业"字段 与 "企业"字段 之间的名称是否相同, 其中是否存在有 "退出"字段的行
   
  • if 如果遇到有"企业"字段 与 "企业"字段 之间的名称不相同,  且它们中间没有 "退出"字段, 则需要添加插入 "退出"字段行,  日期时间填补请使用有"企业"字段的上一行日期时间
  • if 如果有"企业"字段的行  一直至有 "退出"字段行中, 它们名称仍然都是相同的,  ,  则不做任何动作
  1. a.txt  ANSI编码
  2. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  3. 19:37:31 August 16 2023>   ++++
  4. 19:37:32 August 16 2023>   企业 名称:利海 B
  5. 19:37:33 August 16 2023>    +
  6. 19:37:34 August 16 2023>   企业 名称:利海 01:C (A)
  7. 19:37:35 August 16 2023>   +
  8. 19:37:36 August 16 2023>   企业 名称:利海 B
  9. 19:37:39 August 16 2023>   退出
  10. 20:37:30 August 16 2023>   企业 名称:利海 B
  11. 20:39:30 August 16 2023>   企业 名称:利海 B
  12. 20:38:31 August 16 2023>   退出
  13. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  14. 19:37:31 August 16 2023>   ++++
  15. 19:37:31 August 16 2023>   ++++
  16. 19:37:31 August 16 2023>   ++++
  17. 19:37:31 August 16 2023>   ++++
  18. 19:37:31 August 16 2023>   ++++
  19. 19:37:32 August 16 2023>   企业 名称:利海 B
  20. 19:37:33 August 16 2023>    +
  21. 19:37:33 August 16 2023>    +
  22. 19:37:33 August 16 2023>    +
  23. 19:37:33 August 16 2023>    +
  24. 19:37:33 August 16 2023>    +
  25. 19:37:34 August 16 2023>   企业 名称:利海 01:C (A)
  26. 19:37:35 August 16 2023>   +
  27. 19:37:35 August 16 2023>   +
  28. 19:37:35 August 16 2023>   +
  29. 19:37:35 August 16 2023>   +
  30. 19:37:35 August 16 2023>   +
  31. 19:37:36 August 16 2023>   企业 名称:利海 B
  32. 20:37:30 August 16 2023>   +
  33. 20:37:30 August 16 2023>   +
  34. 20:37:30 August 16 2023>   企业 名称:利海 B
  35. 20:39:30 August 16 2023>   +
  36. 20:39:30 August 16 2023>   +
  37. 20:39:30 August 16 2023>   +
  38. 20:39:30 August 16 2023>   企业 名称:利海 B
  39. 20:38:31 August 16 2023>   退出
  40. 19:37:30 August 16 2023>   企业 名称:优 美 利 A
  41. 19:37:31 August 16 2023>   ++++
  42. 19:37:31 August 16 2023>   ++++
  43. 19:37:31 August 16 2023>   ++++
  44. 19:37:31 August 16 2023>   ++++
  45. 19:37:31 August 16 2023>   ++++
  46. 19:37:31 August 16 2023>   退出
  47. 19:37:32 August 16 2023>   企业 名称:海
复制代码

TOP

本帖最后由 77七 于 2023-8-21 13:01 编辑

回复 12# 娜美


  
echo a                        0.41毫秒
echo a>>b.txt,       0.30毫秒
echo. a>>b.txt      1,30毫秒  (不知为什么这一点会多用那么多时间)
findstr “aa” a.txt    44.90毫秒
type a.txt |findstr “aa”   99.12毫秒
for /f %%a in (‘set #’) do (rem),  42.70毫秒
探讨批处理代码效率

说法有误 :文本太大,以500万行算,只echo %%a就需要半小时,echo=%%a,需要更久。而且一个for /f 可能需要2毫秒,乘以500万,又是几个小时。
考虑其它脚本吧。
bat小白,请多指教!谢谢!

TOP

返回列表