找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 85645|回复: 28

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

[复制链接]
发表于 2018-3-25 22:33:14 | 显示全部楼层 |阅读模式
批处理删除许多Txt文件中#符号后面的所有内容,包括#符号也都一起删除,在原文件中执行,不另外产生新文件,请各位大神们帮忙,谢谢

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2018-3-26 09:22:01 | 显示全部楼层
本帖最后由 yhcfsr 于 2018-3-26 11:00 编辑

也不给段例文,你是想删除每行中#后的内容,还是删除#后的全文内容??
建议用POWERSHELL,如果文中有特殊英文标点,文本处理会失真。[code]$SrcDir="D:\test";#源目录
发表于 2018-3-26 09:25:12 | 显示全部楼层
请把原始文件和删除之后想要实现的效果分别发出来看看
 楼主| 发表于 2018-3-26 10:49:14 | 显示全部楼层
回复 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
 楼主| 发表于 2018-3-26 10:50:37 | 显示全部楼层
回复 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
发表于 2018-3-26 14:29:16 | 显示全部楼层
回复 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. }
复制代码
 楼主| 发表于 2018-3-26 23:17:55 | 显示全部楼层
回复 6# yhcfsr
谢谢大神帮忙,我没有用过这种程序,后辍名改为ps1后运行要求修改安全策略,我选择“N”后不能运行,请问能否写成BAT形式的来运行,文本文件内“#”符号前边的内容都是数字格式的,应该不会影响内容,还请大神指点,谢谢
发表于 2018-3-26 23:57:12 | 显示全部楼层
回复 7# f0229f0229


    关于PS脚本限制的问题讲很多了,这里不赘述了。必须管理员打开PS,输入Set-ExecutionPolicy Unrestricted,先择全是才能解除。
除非安全级别很高的地方,否则,这样做也没什么危险。
 楼主| 发表于 2018-3-27 10:27:26 | 显示全部楼层
回复 8# yhcfsr
谢谢大神指导,能否给一个批处理的版本,从使用上来说,我更喜欢用批处理,谢谢
发表于 2018-3-27 11:50:57 | 显示全部楼层
回复 9# f0229f0229


    你的#号是否都在行的开头(或者行尾)?如果在行的中间,就有些麻烦。
 楼主| 发表于 2018-3-27 11:54:03 | 显示全部楼层
回复 10# yhcfsr

都在行的开头
发表于 2018-3-27 12:24:12 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2018-3-27 13:02:54 | 显示全部楼层
本帖最后由 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. )
复制代码

评分

参与人数 1技术 +1 收起 理由
f0229f0229 + 1 热心相助,完美解决

查看全部评分

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

你好,这个程序运行了一下,发现对文本文档里的内容没有改变,不知何故,还请大神再修改一下,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 00:33 , Processed in 0.019044 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表