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


   10楼PowerShell码 基本符合, 但就是会重复多添加一行 "退出"字段

TOP

回复 10# Nsqs


    找到 10楼PowerShell码 问题所在了
    如果"企业" 上下 字段名称不相同  其中间也含有退出字段情况,   他仍然会重复多添加一行 "退出" 字段,,  

他们之间已有了"退出" 字段行,  这种情况下应该跳过不做任何动作

TOP

脑子不灵活的我只能用最原始的方式弄出来,powershell代码
  1. $inf="a.txt"
  2. $otf="b.txt"
  3. $r='企业\s*名称.+|退出'
  4. $inf=[io.file]::ReadAllLines($pwd.path+"\$inf",[text.encoding]::Default)
  5. if(!$inf){exit}
  6. $n=0
  7. $f=[System.IO.StringWriter]::new()
  8. for($i=0;$i -lt $inf.Length;$i++){
  9. if(!$inf[$i]){$f.WriteLine();continue}
  10. if($n -and $n[1]){
  11. $m=[regex]::Match($inf[$i],"$r")
  12. if($m.success -and ($m.value -eq "退出")){$f.WriteLine($inf[$i]);$n=0;continue}
  13. #if($m.success -and ($m.value.split(':')[1] -eq $n.split(':')[1])){$f.WriteLine($inf[$i]);$n=0;continue}
  14. if($m.success -and ($m.value -eq $n[1])){$f.WriteLine($inf[$i]);$n[0]=$i;continue}
  15. if($m.success){
  16. $z=[regex]::Match($inf[$n[0]],">\s*")
  17. echo "从原文本第 $i 行后插入"
  18. $f.WriteLine($inf[$n[0]].substring(0,$z.index+$z.length)+"退出");
  19. $f.WriteLine($inf[$i])
  20. $n=@($i,$m.value);continue}
  21. $f.WriteLine($inf[$i]);$n[0]=$i;continue
  22. }
  23. $m=[regex]::Match($inf[$i],"$r")
  24. if($m.success -and ($m.value -ne "退出")){$n=@($i,$m.value)}
  25. $f.WriteLine($inf[$i])
  26. }
  27. if($n){
  28. $z=[regex]::Match($inf[$n[0]],">\s*")
  29. echo "从原文本末尾插入"
  30. $f.WriteLine($inf[$n[0]].substring(0,$z.index+$z.length)+"退出");
  31. }
  32. [io.file]::WriteAllText($pwd.path+"\$otf",$f.ToString(),[text.encoding]::default)
  33. pause;$f.Dispose()
复制代码

TOP

回复 18# Five66


   完全正确, 谢谢哥哥

TOP

本帖最后由 Nsqs 于 2023-8-20 18:59 编辑
  1. $data=gc a.txt
  2. $s=New-Object 'System.Collections.Generic.List[string][]' 3
  3. $f='企业'
  4. [string[]]$x=@{}
  5. @(for($i=0;$i -lt $data.Count;$i++){
  6.     $x+=$data[$i]
  7.     if($data[$i] -match $f){
  8.         [int]$c=$c%2+1
  9.         $s[$c]=[regex]::Matches($data[$i],"$f.+")
  10.         if($s[1] -ne $s[2] -and $x -notmatch '退出'){
  11.             $b=$data[$i-1]
  12.             if($i -gt 1){[PSCustomObject]@{'Changed'="Source:`t$("$i".PadLeft(4))";Source=$($data[$i-1])}}
  13.             $r="$([regex]::Matches($b,'.+>'))   退出"
  14.             $data[$i-1]="$($b)`r`n$r"
  15.             if($i -gt 1){[PSCustomObject]@{'Changed'="New`t$("$($i+1)".PadLeft(4))";Source=$r}}
  16.         }
  17.         $x=@{}
  18.     }
  19. })|ft -Wrap -AutoSize
  20. $data=$data -split '\r\n'
  21. $data[0..($data.Count-2)]>b.txt
  22. cmd /c pause
复制代码
不知道是不是这样呢?

TOP

回复 1# 娜美
用awk可以实现:
  1. awk -F"企业 名称:" "/^[ t]+$/{next}{C=$0}/企业 名称:/{A=B;B=$2;if(A!=B)C=\"\n\"C}/退出/{C=C\"\n\"}{print C}" a.txt|awk -F"[\n>]+" -vRS="" "/^[ t]+$/{next}/退出/{print $0 \"\n\";next}{print $0\"\n\"$(NF-1)\"^>   退出 \n\"}">b.txt
复制代码

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

都是高手,学习各位

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

本帖最后由 77七 于 2023-8-21 12:54 编辑

回复 24# qixiaobin0715


   谢谢大佬指点!
我自己也试了一下,生成 500万行的 ”19:37:30 August 16 2023>   20854企业 名称:优 美 利 A“,用for /f echo %%a用时5分钟左右。
2009-2023,14年过去了,随着计算机性能提升,效率变高了。可能是5倍。
bat小白,请多指教!谢谢!

TOP

回复 25# 77七


这个差别应该跟硬件关系不太大,更主要的是多次写入和一次写入的区别,参考:
https://mp.weixin.qq.com/s/VZk0TmYUpFdCoWK9ZpgL0Q
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 26# Batcher


   
谢谢站长指点!
用链接中的文本和1.bat测试,
  1. 20:12:26.72
  2. 20:12:32.40
  3. 请按任意键继续. . .
复制代码


耗时6秒左右。
bat小白,请多指教!谢谢!

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

回复 29# qixiaobin0715


   嗯嗯, 哥哥批处理很快哦,,  条件都齐了,, 只是还欠了一种条件,  下面, 这种 上一个 "企业"  与 下一个 "企业" 之间已存在存 "退出" 字段行, 就不用再补了.   
  1. 20:39:30 August 16 2023>   企业 名称:利海 B
  2. 20:38:31 August 16 2023>   退出
  3. 20:38:31 August 16 2023>   +
  4. 20:37:30 August 16 2023>   企业 名称:海
复制代码





  18楼哥哥代码完全遵循所有条件,  所以无论文本内容如何都能正确完成

TOP

返回列表