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

[文本处理] 如何删除文本中的指定字符串并反转/颠倒文本行顺序

求批处理文本 数字内容 排列方法
文本内容1万行为纯数字  如图1
想把文本中 所有开头的20去掉  同时将 后面5位数字之间的空格去掉  实现图2效果
并能 倒过来排列

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-7 delims= " %%i in (1.txt) do (
  3.   set "aa=%%i"
  4.   set aa=!aa:~2!
  5. echo !aa! %%j%%k%%l%%m%%n%%o>>2.txt
  6. )
  7. pause
复制代码
目的,学习批处理

TOP

  1. @set @n=0;/* & echo off
  2. dir /b *.txt|cscript -nologo -e:jscript "%~0" ""
  3. exit/b & rem */
  4. arg = WScript.Arguments(0);
  5. fso = new ActiveXObject("Scripting.FileSystemObject");
  6. while (!WSH.StdIn.AtEndOfStream) {
  7.     f = WSH.StdIn.ReadLine();
  8.     txt = fso.OpenTextFile(f,1).ReadAll();
  9.     txt = txt.replace(/^..(\d+ \d) (\d) (\d) (\d) (\d)/mg,"$1$2$3$4$5");
  10.     fso.OpenTextFile(f,2).Write(txt);
  11. }
复制代码

TOP

回复 2# hlzj88
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1-7" %%i in (1.txt) do (
  4.     set "aa=%%i"
  5.     echo !aa:~2! %%j%%k%%l%%m%%n%%o
  6. ))>2.txt
复制代码
一万行的文本不算小,建议把重定向放到for循环外面,提高执行效率。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4# Batcher

谢谢提醒,细节决定速度。
目的,学习批处理

TOP

回复 4# Batcher
感谢 各位大神指教  等下测试一下

TOP

回复 4# Batcher
测试效果  速度很快 几秒 就好   再请教 如何  将 这1万行数字  倒过来重新排列呢

TOP

回复 2# hlzj88
感谢指示  转换后的结果  如何能   从后而上  倒过来重新排列呢  谢谢

TOP

回复 8# hqhlwz
  1. sort /r 1.txt /o 2.txt
复制代码

TOP

回复 9# flashercs
如何整合到图片中的代码呢?

TOP

本帖最后由 xczxczxcz 于 2018-11-14 18:26 编辑

几万行用纯P,一行行倒过来赋值给变量。速度估计个把小时。
下面的为 PowerShell 版。WIN7以上系统可用。PS3.0以上最好。
121440行。约12秒完成 修改并全部倒排。
  1. $StartTime= Get-date # 开始计时
  2. ((cat ".\00.txt") | %{
  3. $str=$_ -replace "^20","" -replace "[\s]",""
  4. $str.insert(10," ")
  5. }
  6. ) | SC "$env:temp\ref.txt"
  7. $Total = (cat "$env:temp\ref.txt" -TotalCount -1).Count
  8. (Cat "$env:temp\ref.txt")[$Total..0] | SC ".\ok.txt"
  9. Ri "$env:temp\ref.txt" -force
  10. Write-host "共用时间:"([DateTime]::Now - $StartTime).TotalMilliseconds"毫秒" -Fore RED
  11. # 计时结束
  12. pause
复制代码
===========保存为 xxx.ps1  点右键用 windows powershell 运行。系统自带
-------------------------------------------------------------------------------------------------------

附上 纯P 供参考:
  1. @echo off & cd /d "%~dp0"
  2. echo %time%
  3. setlocal EnableDelayedExpansion
  4. for /f "tokens=1*" %%a in (00.txt) do (
  5. set "aa=%%a"
  6. set "bb=%%b"
  7. set /a n+=1
  8. set "str!n!=!aa:~2! !bb: =!"
  9. rem echo !aa:~2! !bb: =!
  10. )
  11. (for /l %%e in (%n% -1 1) do echo !str%%e!)>final.txt
  12. echo %time%
  13. pause & exit
复制代码
注不要用 sort /r 它会按大小排序。

TOP

回复 11# xczxczxcz
感谢你的提示 刚测试你的方法 用sort的方法 也测试了 结果是一样  但使用大神你的代码  转换过程有点慢
能否提高一下效率呢

附上 测试文件 下载地址http://data.917500.cn/cqssc_10000.txt

TOP

回复 12# hqhlwz


    偶那个是倒排的。不是倒序排列。倒序是从大到小排列。若你的原始文档是从小到大排好的。那倒排和倒序是一样的。用 sort /r 当然快。若你的原始文本内容并不是从小到大排列,是乱序的。倒排和倒序就不一样了。偶写的是倒排。不管你原始顺序如何。都是按原文本从后到前排列。不会受字符大小的影响。看你的需求了。

TOP

回复 12# hqhlwz

    针对你这个文本。全是从小到大的排序。当然简单了。

纯 P 约 2秒
  1. @echo off & cd /d "%~dp0"
  2. echo %time%
  3. setlocal EnableDelayedExpansion
  4. (for /f "tokens=1*" %%a in (00.txt) do (
  5. set "aa=%%a"
  6. set "bb=%%b"
  7. echo !aa:~2! !bb: =!
  8. ))>%temp%\ref.txt
  9. sort /r "%temp%\ref.txt" /o final.txt
  10. del /q/f "%temp%\ref.txt"
  11. echo %time%
  12. pause
复制代码
=============================
纯 PS 约 0.6秒
  1. $StartTime= Get-date # 开始计时
  2. ((cat ".\00.txt") | sort -desc | %{
  3. $str=$_ -replace "^20","" -replace "[\s]",""
  4. $str.insert(10," ")
  5. }
  6. ) | SC ".\ok.txt"
  7. $Time = [DateTime]::Now - $StartTime
  8. Write-host "共用时间:"$Time.Seconds"秒 "$Time.Milliseconds"毫秒" -Fore RED
  9. # 计时结束
  10. pause
复制代码
==============================

TOP

本帖最后由 WHY 于 2018-11-16 19:50 编辑
  1. gawk "{a[NR]=substr($1,3)\" \"$2\"\"$3\"\"$4\"\"$5\"\"$6}END{for(i=NR;i>0;i--)print a[i]}" 1.txt > 2.txt
复制代码
  1. PowerShell "[Collections.ArrayList]$arr=[IO.File]::ReadAllLines('1.txt') -replace '^20|(?<!\d\d)\s';$arr.Reverse();sc 2.txt -Value $arr"
复制代码
  1. sort /r 1.txt | sed -r "s/^20|\s//g; s/[0-9]{5}$/ &/" > 2.txt
复制代码
1

评分人数

    • smss: 你咋这么牛技术 + 1

TOP

返回列表