Board logo

标题: [文本处理] 【已解决】求助!批处理删除TXT文档中的所有指定字符 [打印本页]

作者: f0229f0229    时间: 2018-4-17 17:37     标题: 【已解决】求助!批处理删除TXT文档中的所有指定字符

本帖最后由 f0229f0229 于 2018-4-17 19:58 编辑

请大神帮忙,批处理删除TXT文档中的所有“:”号,就在当前文本文档内删除,不产生新文件,如果包含文本文档的文件夹里还有其它子文件夹,则只处理当前的文本文档,不再自动打开其它子文件夹。
示例:
原文本文档内容(行数不定,最多不超过150000行)
2:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:2:1
2:0:0:0:0:0:0:0:0:0:0:0:0:1:0:1:1:1
2:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:2:1
2:0:0:0:0:0:0:0:0:0:0:0:0:0:1:1:1:1
2:0:0:0:0:0:0:0:0:0:0:0:0:0:1:1:1:1
2:0:0:0:0:0:0:0:0:0:0:0:0:0:1:1:1:1
2:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:2:1
2:0:0:0:0:0:0:0:0:0:0:0:0:0:1:1:1:1
2:0:0:0:0:0:0:0:0:0:0:0:0:0:1:1:1:1
2:0:0:0:0:0:0:0:0:0:0:0:0:0:1:1:2:0
2:0:0:0:0:0:0:0:0:0:0:0:0:0:1:1:1:1
2:0:0:0:0:0:0:0:0:0:0:0:0:0:1:1:1:1
批处理后的内容(这是用的替换命令达到的)
200000000000010021
200000000000010111
200000000000010021
200000000000001111
200000000000001111
200000000000001111
200000000000001021
200000000000001111
200000000000001111
200000000000001120
200000000000001111
200000000000001111
找了一个批处理,但是没有效果,不知何原因,还请大神给指点,谢谢
@echo off

for /f "delims=: tokens=1-18" %%a in ('dir/b *.txt') do (

    echo %%a%%b%%c%%d

)

pause
作者: yhcfsr    时间: 2018-4-17 18:03

  1. @echo off
  2. for /f "delims=" %%a in ('dir /a-d/b *.txt') do (
  3. (for /f "delims=" %%b in ('type "%%a"') do (
  4. set "str=%%b"&setlocal enabledelayedexpansion
  5. echo;!str::=!&endlocal
  6. ))>"out.log"
  7. move /y "out.log" "%%a"
  8. )
复制代码

作者: f0229f0229    时间: 2018-4-17 19:55

回复 2# yhcfsr
谢谢大神,完美的解决了问题
作者: tigerpower    时间: 2018-4-18 18:36

回复 2# yhcfsr

150000行的话貌似不行
作者: yhcfsr    时间: 2018-4-18 18:58

回复 4# tigerpower


    什么问题?
   批处理本身不擅长文本,像你这样长的文件,即使能处理,耗时定然很长了。
作者: tigerpower    时间: 2018-4-18 20:23

本帖最后由 tigerpower 于 2018-4-18 21:50 编辑

楼主说”最多不超过150000行“。

用Windows自带的”记事本“替换,
15万行不超过3秒,150万行不超过10秒,
加上打开记事本、保存等操作保守估计总时间不会超过60秒。

写二楼的这段批处理代码应超过60秒,
15万行运行超过600秒(6000秒?)
批处理太慢了,不太实用。
作者: yhcfsr    时间: 2018-4-18 21:49

本帖最后由 yhcfsr 于 2018-4-18 21:53 编辑

回复 6# tigerpower


楼上说得有理。逐行处理文本的方式,对于长文本的确不合适。
因此我尝试POWERSHELL,做了个71W行的文本(26M),用powershell处理了也花68S,而用记事本打开,替换,保存也就10多秒的事。
15W行,8.8秒处理完成。
以下是测试代码:
  1. cls;
  2. $file=$null;
  3. $time=get-date
  4. $file=Get-Content "d:\test\out.txt";
  5. $file=($file -replace ':','');
  6. out-file "d:\test\out.txt" -InputObject $file;
  7. ((get-date)-$time).TotalSeconds
复制代码

作者: Batcher    时间: 2018-4-19 11:16

回复 6# tigerpower


    也许楼主每天需要处理100个这样的文件呢
作者: pcl_test    时间: 2018-4-19 12:17

  1. #*第三方http://www.bathome.net/s/tool/index.html?key=gawk
  2. #*&cls&2>nul md "result\" &dir /a-d/b *.txt|gawk -f "%~f0"&pause&exit
  3. BEGIN{
  4.     while(getline file>0){
  5.         while(getline<file>0){
  6.             gsub(/:/,"");
  7.             print>"result\\"file;
  8.         }
  9.     }
  10. }
复制代码

作者: tigerpower    时间: 2018-4-20 05:55

回复 9# pcl_test

代码执行后,就新建了一个result文件夹。




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