Board logo

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

作者: hqhlwz    时间: 2018-11-13 17:05     标题: 如何删除文本中的指定字符串并反转/颠倒文本行顺序

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

  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
复制代码

作者: xp3000    时间: 2018-11-13 20:16

  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. }
复制代码

作者: Batcher    时间: 2018-11-13 21:25

回复 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循环外面,提高执行效率。
作者: hlzj88    时间: 2018-11-13 22:23

回复 4# Batcher

谢谢提醒,细节决定速度。
作者: hqhlwz    时间: 2018-11-13 22:42

回复 4# Batcher
感谢 各位大神指教  等下测试一下
作者: hqhlwz    时间: 2018-11-13 22:53

回复 4# Batcher
测试效果  速度很快 几秒 就好   再请教 如何  将 这1万行数字  倒过来重新排列呢
作者: hqhlwz    时间: 2018-11-13 23:14

回复 2# hlzj88
感谢指示  转换后的结果  如何能   从后而上  倒过来重新排列呢  谢谢
作者: flashercs    时间: 2018-11-14 00:48

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

作者: hqhlwz    时间: 2018-11-14 14:11

回复 9# flashercs
如何整合到图片中的代码呢?
作者: xczxczxcz    时间: 2018-11-14 18:19

本帖最后由 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 它会按大小排序。
作者: hqhlwz    时间: 2018-11-14 19:10

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

附上 测试文件 下载地址http://data.917500.cn/cqssc_10000.txt
作者: xczxczxcz    时间: 2018-11-14 19:49

回复 12# hqhlwz


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

回复 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
复制代码
==============================
作者: WHY    时间: 2018-11-14 21:09

本帖最后由 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
复制代码

作者: hqhlwz    时间: 2018-11-15 02:03

本帖最后由 hqhlwz 于 2018-11-15 02:06 编辑

回复 13# xczxczxcz


    哦 是的  按照倒排结果就可以  大小的 不需要 . 但 为什么 用 你的方法 与用 sort的结果 会是一样的呢 ? 我原始文档 开头是日期数字 后是随机0到9的随机数字    谢谢指教
作者: hqhlwz    时间: 2018-11-15 05:46

回复 14# xczxczxcz

再次请教第二个问题  不知道能否解决   转换后文本 数据不能调用  后来排查出事空格长度的问题 图中红色方框内的数据能识别   红色框以下的 需要一个一个修改 才能使用  请问 批处理有否方法统一处理呢
用笔记本打开 无区别   但后来用 word 打开 才发现问题  请指教 谢谢
作者: flashercs    时间: 2018-11-15 07:49

回复 17# hqhlwz


    word都打开了,就不能批量替换掉?
作者: xczxczxcz    时间: 2018-11-15 08:13

本帖最后由 xczxczxcz 于 2018-11-15 20:27 编辑

回复 17# hqhlwz


    我看不出脚本有何异样, 你的原文件是sort 排序好了,所以倒排、倒序是一样的。你用PS脚本或其他大神的脚本试试,也可试用下面的
修改一下 添加对制表符支持  输出制表符
  1. @echo off & cd /d "%~dp0"
  2. echo %time%
  3. setlocal EnableDelayedExpansion
  4. (for /f "tokens=1* delims= " %%a in ('sort /r 00.txt') do (
  5. set "aa=%%a" & set "bb=%%b" & set "bb=!bb: =!"
  6. echo !aa:~2! !bb: =!
  7. ))>final.txt
  8. echo %time%
  9. pause
复制代码
或者需要检查一下你原文件。手机码字可能有疏漏。
作者: xczxczxcz    时间: 2018-11-15 09:03

回复 16# hqhlwz

刚登陆电脑,用WORD 打开看了下,木有问题啊。都很正常啊。
作者: hqhlwz    时间: 2018-11-15 15:39

回复 18# flashercs


    word很麻烦  没bat那么方便实际
作者: hqhlwz    时间: 2018-11-15 15:47

回复 20# xczxczxcz
数据内容是问没问题 ,问题 调用这个文本的时候    中间那个空格 长度 太长   软件 不能调用出来   软件只能 自动默认 红色框里面的短空格长度  我发个我手工修改过的 能调用的文本 你用word对比一下 就明白
下图打勾的数据 软件能读出来 打叉的不能读出来   后来发现  是中间 空格距离的问题   复制打勾能识别的空格  覆盖下面空格距离 然后 就能软件就能识别
我这样表达能理解吗   大概意思是 空格符 的距离问题
作者: xczxczxcz    时间: 2018-11-15 16:29

回复 22# hqhlwz

WORD  EXCEL 都正常。你的是什么鸟 word. 偶打开木有任何问题,所有空格都是一样的。
作者: xczxczxcz    时间: 2018-11-15 16:37

本帖最后由 xczxczxcz 于 2018-11-15 16:44 编辑

回复 22# hqhlwz

我知道问题了,你发的文件和你发的链接的文本格式不一样,你大爷的。又来这一套。你发的网上链接下载的文件是空格分格的,而你现在的文件有空格也有制表符。等下给你弄个新的。

把你完整文件发个链接,不要部分。
作者: xp3000    时间: 2018-11-15 16:39

word很容易,只不过你不会用
作者: hqhlwz    时间: 2018-11-15 16:42

回复 23# xczxczxcz


    感谢大神在线回复   不是word问题  你复制几行 我修改过的数字 到 原转换后的文件 对比一下就能看到  这样  我发一个上来  我的是  用word 2003或用wps打开 都一样 图中是 空格的距离 令到数据不能对齐  不知道 是否原软件作者编写原因
]空格距离 只有按这个1.txt文件 才能有效识别
作者: xczxczxcz    时间: 2018-11-15 16:47

回复 26# hqhlwz

你后面这部分带制表符,你先前发的链接只有空格。你发个完整内容的的链接,再给你改下,或者你在WORD把制表符替换为空格。
作者: hqhlwz    时间: 2018-11-15 16:55

回复 27# xczxczxcz
我是复制1.txt 里面的空格距离  到转换后 final.txt 软件才能识别  改一天期数才能读出一天的数据
作者: hqhlwz    时间: 2018-11-15 16:56

回复 27# xczxczxcz
表符??不理解.....
作者: xczxczxcz    时间: 2018-11-15 16:58

回复 29# hqhlwz

把制表符也选上 一起作分隔。
作者: xczxczxcz    时间: 2018-11-15 17:03

回复 29# hqhlwz

你的 1.txt 是以制表符和空格混杂分隔的。偶们的 final.txt 是以空格分隔的。明白不。所以你把空格换成制表符,或者把制表符控成空格。
作者: 523066680    时间: 2018-11-15 17:56

本帖最后由 523066680 于 2018-11-15 17:58 编辑

bathome 最欢迎这种提问方式了,循环渐进

1. 在首楼提问的时候先晒出冰山一角,最好是截图。原文?浪费题主时间,热心的坛友会自己打字的。
2. 有人来解答了,不对,这不符合要求,补充问题
3. 回答更新了,但是我还有个需求,麻烦再改一下。
4. 算了我还是post完整的资料上来吧。
5. 还是不太对,blah, blah, blah 答主你到底明不明白我的意思?
6. 算了我把整个操作环境也交代一下。
7. 你们这些 ××
作者: hqhlwz    时间: 2018-11-15 18:21

回复 31# xczxczxcz
明白  能否 转换过程中  把这个位置的空格符转换成表符呢?谢谢
作者: hqhlwz    时间: 2018-11-15 18:25

回复 25# xp3000
你可以分享一下你的 word的方法 大家交流一下
作者: hqhlwz    时间: 2018-11-15 18:26

回复 32# 523066680


    因为 打字与现实环境 有出入  还需要 不断验证  才能达到效果 一致  版主见谅了
作者: hqhlwz    时间: 2018-11-15 18:46

回复 19# xczxczxcz
感谢修改  刚测试了一下   原文本是空格符前提下  转换后 依然是空格符   能否实现  这个位置的 空格符  全部默认是 全部转换成表符呢?谢谢
作者: WHY    时间: 2018-11-16 20:33

回复 36# hqhlwz


   

    哪来的“表符”?眼拙咋不说说成“表情符号”更动听?
那是“制表符”,键盘上的 Tab 键
作者: xp3000    时间: 2018-11-17 10:16

打开Word,勾选通配符,
图片不能超过50k,所以不能发
  1. [0-9]{2}([0-9]{9} [0-9]) ([0-9]) ([0-9]) ([0-9]) ([0-9])
  2. 替换
  3. \1\2\3\4\5
复制代码
又不能超过50k,倒序你应该会吧
作者: smss    时间: 2019-5-13 11:23

回复 15# WHY

元素的逆向排序 http://www.bathome.net/thread-52760-1-1.html 能帮看一下吗




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