Board logo

标题: [文本处理] 批处理如何对txt文本里采用科学计数法表示的数字进行排序? [打印本页]

作者: xyq916    时间: 2016-4-22 17:21     标题: 批处理如何对txt文本里采用科学计数法表示的数字进行排序?

本帖最后由 pcl_test 于 2016-4-22 19:55 编辑

文本文档“1.txt”,里面的内容只有一列,这一列的最上面6行为标题、说明等文字内容,第7行开始到6342行为一列数字,
如何实现把这一列数字从大到小排序后输出到“2.txt”文本文档。数字采用科学计数法,这一列数字中有比较多的0项,
  1. [Name]
  2. R1 Blade
  3. [Data]
  4. alum.Erosion Rate
  5. 0.00000000e+000
  6. 0.00000000e+000
  7. 0.00000000e+000
  8. 0.00000000e+000
  9. 2.11508553e-002
  10. 0.00000000e+000
  11. 4.23389673e-002
  12. 0.00000000e+000
  13. 1.69804394e-001
  14. 2.79017985e-001
  15. 2.89141804e-001
  16. 0.00000000e+000
  17. 1.37632385e-001
  18. 0.00000000e+000
  19. 3.52498561e-001
  20. 0.00000000e+000
  21. 0.00000000e+000
  22. 9.83318090e-002
  23. 4.75238204e-001
  24. 0.00000000e+000
  25. 0.00000000e+000
复制代码

作者: happy886rr    时间: 2016-4-22 18:58

本帖最后由 happy886rr 于 2016-4-22 20:30 编辑

回复 1# xyq916
思路演示:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('more +13 %0^|find "+"^|find /v "+000"') do (
  3. set str=%%a&echo !str:~-3!!str!
  4. ))>$
  5. (for /f "delims=" %%a in ('sort /r $') do (
  6. set str=%%a&echo !str:~3!
  7. ))>new.txt
  8. (for /f "delims=" %%a in ('more +13 %0^|find "-"') do (
  9. set str=%%a&set/a z=1999-1!str:~-3!&echo !z!!str!
  10. ))>$
  11. (for /f "delims=" %%a in ('sort /r $') do (
  12. set str=%%a&echo !str:~3!
  13. ))>>new.txt&more +13 %0|find "+000" >>new.txt&del $&start new.txt&exit
  14. 0.00000000e+000
  15. 4.23389673e-002
  16. 1.69804394e-001
  17. 2.79017985e-001
  18. 1.37632385e+001
  19. 9.83318090e+002
复制代码
实测2万行排序,也不过3秒而已。请自行添加数字到尾部。
作者: xyq916    时间: 2016-4-22 21:05

回复 2# happy886rr

大神您好,本人菜鸟此前一点没接触过这方面知识,我把您发的代码01~13行复制到文本文档里,然后改成bat文件,
然后将bat文件和要处理的“1.txt”文件放到同一个文件夹,双击bat文件,得到了1个空的"new.txt"文件,您后面的提示说:请自行添加数字到尾部
是指把要排序的数字考到bat文件中的最后面吗,我有很多个“1.txt”这的文本要处理,我想要在只有一个“1.txt”和bat文件的文件夹里双击bat文件得到我要的"new.txt",请问如何实现。
作者: CrLf    时间: 2016-4-22 21:33

本帖最后由 CrLf 于 2016-4-22 22:26 编辑

正好适合js
  1. @mshta http://bathome.net/s/hta/?string var arr=type('测试.txt').split('\r\n');head=arr.slice(0,6);body=arr.slice(7).sort(function(a,b){return b*1-a*1});head.concat(body) >输出.txt
复制代码

作者: happy886rr    时间: 2016-4-22 22:03

本帖最后由 happy886rr 于 2016-4-22 22:05 编辑

回复 3# xyq916
把代码里的%0,改成1.txt就是你要的。这个你应该会改(总共有3个%0,仔细找找),我就不重复写了。
作者: CrLf    时间: 2016-4-22 22:04

回复 4# CrLf


    哦可以不用 *1,肯定是数字运算
作者: happy886rr    时间: 2016-4-22 22:06

回复 6# CrLf
大师,他是要从大到小排列。+000在最底下
作者: xyq916    时间: 2016-4-22 22:25

回复 7# happy886rr
成功了!各位辛苦啦!感谢各位大神!祝愿 批处理之家 越办越好!
作者: CrLf    时间: 2016-4-22 22:26

回复 7# happy886rr


    哦,那把 a b 对调一下就好了
作者: CrLf    时间: 2016-4-22 22:35

顺便说一句,也可以用暴力解:
  1. @echo off
  2. (
  3. find "e+" a.txt | findstr "[1-9].*e" | sort /r | sort /+10
  4. find "e-" a.txt | sort /r | sort /+10
  5. find "e+" a.txt | findstr /v "[1-9].*e"
  6. )>new.txt
复制代码

作者: pcl_test    时间: 2016-11-19 16:46

  1. rem win7及以上系统运行
  2. powershell -c "$a=gc '文本.txt';$a[0..4];$a[5..($a.count-1)]|sort {1*$_} -desc"
  3. pause
复制代码

作者: xyq916    时间: 2018-12-13 20:30

回复 11# pcl_test


    多谢!
作者: 523066680    时间: 2018-12-13 22:14

长达两年的Response
作者: CrLf    时间: 2018-12-13 23:00

...




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