Board logo

标题: [文本处理] [已解决]求助!批处理删除文本文件中的#号及其以后的内容 [打印本页]

作者: f0229f0229    时间: 2018-3-25 22:33     标题: [已解决]求助!批处理删除文本文件中的#号及其以后的内容

批处理删除许多Txt文件中#符号后面的所有内容,包括#符号也都一起删除,在原文件中执行,不另外产生新文件,请各位大神们帮忙,谢谢
作者: yhcfsr    时间: 2018-3-26 09:22

本帖最后由 yhcfsr 于 2018-3-26 11:00 编辑

也不给段例文,你是想删除每行中#后的内容,还是删除#后的全文内容??
建议用POWERSHELL,如果文中有特殊英文标点,文本处理会失真。[code]$SrcDir="D:\test";#源目录
作者: Batcher    时间: 2018-3-26 09:25

请把原始文件和删除之后想要实现的效果分别发出来看看
作者: f0229f0229    时间: 2018-3-26 10:49

回复 2# yhcfsr
对不起,想简单了,原文件内“#”之前的内容有多有少格式固定,“#”之后内容大部分是这样的固定格式,我想要的效果是:不管文本内容里有多少个“#”符号,都只保留第一个“#”符号之前的内容,“#”符号之后(包括“#”符号在内),不管是什么格式,有多少内容,全部删除,并且都在原文件内执行,不产生新的文件,还请大神帮忙,谢谢
1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3
#START_USER_DATA
1  2  3  4  5  6
7  8  9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33 34 35 36
37 38 39 40 41 42
#CONFIG_DATA20
8 8 8 88  8  8  8
#END_USER_DATA

批处理以后的效果
1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3
作者: f0229f0229    时间: 2018-3-26 10:50

回复 3# Batcher

对不起,想简单了,原文件内“#”之前的内容有多有少格式固定,“#”之后内容大部分是这样的固定格式,我想要的效果是:不管文本内容里有多少个“#”符号,都只保留第一个“#”符号之前的内容,“#”符号之后(包括“#”符号在内),不管是什么格式,有多少内容,全部删除,并且都在原文件内执行,不产生新的文件,还请大神帮忙,谢谢
1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3
#START_USER_DATA
1  2  3  4  5  6
7  8  9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33 34 35 36
37 38 39 40 41 42
#CONFIG_DATA20
8 8 8 88  8  8  8
#END_USER_DATA

批处理以后的效果
1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3
作者: yhcfsr    时间: 2018-3-26 14:29

回复 4# f0229f0229
POWERSHELL
  1. $SrcDir="D:\test";#源目录
  2. Get-ChildItem -Path $SrcDir -Recurse -Filter *.txt|ForEach-Object{
  3. $str=$null;$flag=$false;
  4.     $content=Get-Content -Path $_.fullname;
  5.     foreach($line in $content){
  6.        for($i=0;$i -lt $line.Length;$i++){
  7.         if($line[$i] -eq '#'){$flag=$true;break}else{$str+=$line[$i]}
  8.        }#for
  9.        if($flag){break;}else{$str+="`r`n"}
  10.     }#foreach
  11.     Out-File -FilePath $_.FullName -InputObject $str;      
  12. }
复制代码

作者: f0229f0229    时间: 2018-3-26 23:17

回复 6# yhcfsr
谢谢大神帮忙,我没有用过这种程序,后辍名改为ps1后运行要求修改安全策略,我选择“N”后不能运行,请问能否写成BAT形式的来运行,文本文件内“#”符号前边的内容都是数字格式的,应该不会影响内容,还请大神指点,谢谢
作者: yhcfsr    时间: 2018-3-26 23:57

回复 7# f0229f0229


    关于PS脚本限制的问题讲很多了,这里不赘述了。必须管理员打开PS,输入Set-ExecutionPolicy Unrestricted,先择全是才能解除。
除非安全级别很高的地方,否则,这样做也没什么危险。
作者: f0229f0229    时间: 2018-3-27 10:27

回复 8# yhcfsr
谢谢大神指导,能否给一个批处理的版本,从使用上来说,我更喜欢用批处理,谢谢
作者: yhcfsr    时间: 2018-3-27 11:50

回复 9# f0229f0229


    你的#号是否都在行的开头(或者行尾)?如果在行的中间,就有些麻烦。
作者: f0229f0229    时间: 2018-3-27 11:54

回复 10# yhcfsr

都在行的开头
作者: yhcfsr    时间: 2018-3-27 12:24

本帖最后由 yhcfsr 于 2018-3-27 12:31 编辑

回复 11# f0229f0229


随手写了个,完全没什么效率,多文件长文本执行时间很长。先用着吧,有时间再搞个优化的。不过BAT处理长文本的效率本身就很差,还是要习惯powershell
  1. @echo off
  2. rem 源目录
  3. set "SrcDir=D:\test"
  4. for /f  "delims=" %%a in ('dir /a-d/s/b "%SrcDir%\*.txt"') do (
  5. call :read_txt "%%a"
  6. if exist "%%a.log" move /y "%%a.log" "%%a"
  7. )
  8. pause&exit
  9. :read_txt
  10. setlocal
  11. set "file=%~1"
  12. (for /f  "delims=" %%b in ('findstr /n ".*" "%file%"') do (
  13.         set "var=%%b"
  14. setlocal enabledelayedexpansion
  15.         set var=!var:*:=!
  16. echo;"!var!"|findstr "#">nul&&(endlocal&goto:eof)
  17. echo;!var!
  18. endlocal
  19. ))>"%file%.log"
  20. endlocal
复制代码

作者: yhcfsr    时间: 2018-3-27 13:02

本帖最后由 yhcfsr 于 2018-3-27 16:05 编辑

【修正】优化上面的代码,效率比上面那个快10倍不止
  1. @echo off
  2. rem 源目录
  3. set "SrcDir=D:\test"
  4. for /f  "delims=" %%a in ('dir /a-d/s/b "%SrcDir%\*.txt"') do (
  5. set line=&set n=
  6. for /f "delims=[]" %%b in ('find /n "#" ^<"%%a"') do if not defined line set/a line=%%b
  7. if defined line (
  8. (for /f "delims=" %%b in ('findstr /n ".*" "%%a"') do (
  9. set/a n+=1&set "var=%%b"
  10. setlocal enabledelayedexpansion
  11. if !n! lss !line! set "var=!var:*:=!"&&echo;!var!
  12. endlocal
  13. ))>"%%a.log"
  14. if exist "%%a.log" move /y "%%a.log" "%%a"
  15. )   
  16. )
复制代码

作者: f0229f0229    时间: 2018-3-27 13:57

回复 12# yhcfsr
你好,试用了一下,单个Txt文档都运行不完,我根据你的指点,在想能不能将以下步骤转化为批处理程序来运行,第一步,统计当前文件夹中的Txt文档数量,第二步,同时在每个文件中向下查找“#”,找到后选择“#”至文档的最后一行包括“#”都删除,然后保存,如果有个别Txt文档内容里没有查找到“#”就跳过,这样是不是就运行快了,还请大神帮忙,谢谢
作者: f0229f0229    时间: 2018-3-27 14:03

回复 13# yhcfsr

你好,这个程序运行了一下,发现对文本文档里的内容没有改变,不知何故,还请大神再修改一下,谢谢
作者: yhcfsr    时间: 2018-3-27 14:07

回复 15# f0229f0229


   发个样本过来看看,测试没问题。
作者: zaqmlp    时间: 2018-3-27 14:09

  1. @echo off
  2. 2>nul md "result\"
  3. for /f "delims=" %%a in ('dir /a-d/b *.txt') do (
  4.     echo;"%%a"
  5.     >nul find "#" "%%a"&&(set "file=%%a"&call :loop)||copy "%%a" "result\"
  6. )
  7. pause&exit
  8. :loop
  9. >"result\%file%" (for /f "delims=" %%b in ('findstr /n .* "%file%"') do (
  10.     set "line=%%b"
  11.     setlocal enabledelayedexpansion
  12.     if "!line:#=!" neq "!line!" (
  13.         for /f "delims=#" %%d in ("!line!") do set "endline=%%d"
  14.         echo;!endline:*:=!
  15.         goto :eof
  16.     ) else echo;!line:*:=!
  17.     endlocal
  18. ))
复制代码

作者: zaqmlp    时间: 2018-3-27 14:38

  1. @echo off
  2. md "result\" 2>nul
  3. powershell "dir . *.txt|%%{$txt=(gc $_.FullName) -join \"`r`n\";$txt -replace '(?s)#.*$',''|out-file ('result\'+$_.Name) -enc default}"
  4. pause
复制代码

作者: f0229f0229    时间: 2018-3-27 15:02

回复 16# yhcfsr

已上传,请查看
作者: f0229f0229    时间: 2018-3-27 15:03

回复 18# zaqmlp

这段代码运行时报警了
作者: f0229f0229    时间: 2018-3-27 15:05

本帖最后由 f0229f0229 于 2018-3-27 15:09 编辑

回复 17# zaqmlp

你好,代码运行后生成一个新文件夹,内有同名txt文档,但不是我要的内容,我已上传样本,请帮忙看看,谢谢
作者: zaqmlp    时间: 2018-3-27 15:30

回复 20# f0229f0229


    是“哇唔~嘟嘟”还是“滴嘟,滴嘟”
作者: f0229f0229    时间: 2018-3-27 15:34

回复 22# zaqmlp

是腾讯管家提示的
作者: zaqmlp    时间: 2018-3-27 15:48

回复 23# f0229f0229

厉害,那么隐蔽都被检测出来,要不然你的qq和微信就是我的了,腾讯最牛了!!
作者: yhcfsr    时间: 2018-3-27 16:06

回复 15# f0229f0229


    13楼已修正
作者: yhcfsr    时间: 2018-3-27 17:07

回复 15# f0229f0229


    13楼已修正
作者: f0229f0229    时间: 2018-3-27 19:23

回复 26# yhcfsr

郁闷,为何我用不了,运行速度非常快,但是txt文档里的内容一点变化都没有,我用发给你“举例文件”试了也没有反应,我把程序里的第一句的盘符改了也没有变化,我把程序里的前两句“rem 源目录,set "SrcDir=d:\test"删除后程序就运行好几分钟,得出一个如图的内容
请大神看看是什么原因,谢谢
作者: yhcfsr    时间: 2018-3-27 19:36

回复 27# f0229f0229


    加我QQ 33892006
作者: f0229f0229    时间: 2018-3-27 22:21

答案在13楼,非常感谢yhcfsr (UID: 82981) 的热心指导,问题完美解决了,也谢谢其他热心朋友的相助。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2