标题: [文本处理] [已解决]批处理如何将文本内容行倒排序? [打印本页]
作者: wh1234567 时间: 2011-4-26 20:52 标题: [已解决]批处理如何将文本内容行倒排序?
批处理如何将文本内容行倒排序?并输出到另外文本里
例如原文本内容:
2222
222v飞v
342
不同提供343
处理后:
不同提供343
342
222v飞v
2222
作者: CrLf 时间: 2011-4-26 22:25
本帖最后由 zm900612 于 2011-4-26 23:45 编辑
小吹一下,我发现我貌似在算法方面小有天赋...- @echo off&setlocal enabledelayedexpansion
- findstr /n .* 1.txt >2.txt
- set "str=[0-9][0-9][0-9][0-9]"
- (for /l %%a in (1 1 4) do (
- for /f "tokens=1* delims=:" %%b in ('findstr "^^!str!:" 2.txt^|sort /r') do echo %%c
- set str=!str:*]=!
- ))>b.txt
- pause
复制代码
作者: applba 时间: 2011-4-26 23:28
sort这么好用吗?
打上编号,再倒过来就行了。
作者: CrLf 时间: 2011-4-26 23:46
修正了两处笔误。
作者: batman 时间: 2011-4-26 23:47
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do set "str="%%a" !str!"
- (for %%a in (!str!) do echo %%~a)>tem
- del /q a.txt&ren tem a.txt
- start a.txt
复制代码
作者: wh1234567 时间: 2011-4-27 00:24
5# batman
版主您好,为什么这个批处理只能处理一半就退出了,不能完全处理,例如21.6KB的文本只能处理10.8KB,是不是需要修改一下代码?昨天我也发现另外一个批处理也是不能够完全处理,小文本可以处理,同样格式的大文本就无法执行处理了,不知道是代码咋回事
作者: CrLf 时间: 2011-4-27 00:34
因为变量长度有限。2楼代码已修正原先的两处笔误,试下有没有用
作者: batman 时间: 2011-4-27 00:36
本帖最后由 batman 于 2011-4-27 08:10 编辑
因为cmd中的变量名+值的字节数上限为8190,当文本足够大时,代码中的str变量就会发生溢出,修改如下:- @echo off&setlocal enabledelayedexpansion
- set /a num=1
- for /f "delims=" %%a in (a.txt) do (
- set /a n+=1,m=n%%100
- if !m! equ 0 set /a num+=1
- for %%b in (!num!) do set "str_%%b="%%a" !str_%%b!"
- )
- (for /l %%a in (%num%,-1,1) do (
- for %%b in (!str_%%a!) do echo %%~b
- ))>tem
- del /q a.txt&ren tem a.txt
- start a.txt
复制代码
作者: wh1234567 时间: 2011-4-27 00:53
8# batman
好像还是不能正常处理
作者: wh1234567 时间: 2011-4-27 00:56
2# zm900612
这个可以正常处理,很感谢大家的帮助
作者: Batcher 时间: 2011-4-27 01:01
1# wh1234567 复制代码
http://bbs.bathome.net/thread-1114-1-1.html
作者: batman 时间: 2011-4-27 01:24
本帖最后由 batman 于 2011-4-27 01:25 编辑
9# wh1234567
代码中少写了一个do,笔误,已改正,应该能处理了。
你如果不是小白应该能够发现这个问题改正啊,晕。。。。
作者: hanyeguxing 时间: 2011-4-27 06:42
12# batman
我以为只有我才常干这种事。。。
作者: wc726842270 时间: 2011-4-27 11:22
我也凑凑热闹,好久没发贴子了,都快忘了,呵呵- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in ('findstr /n .* 1.txt') do set
-
- str=%%i&&set _!str!=%%j&set /a n+=1
- :1
- echo !_%n%!
- set /a n-=1
- if %n% equ 0 (pause&goto :eof) else goto :1
复制代码
作者: batman 时间: 2011-4-27 12:30
14# wc726842270
处理超大文本不考虑效率是不行的,如果文本足够大,你这个代码估计最后没有结果出来。。。
作者: CrLf 时间: 2011-4-27 13:00
另外一种,以前经常用的:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set /a n+=100001
- echo !n:~-6!:%%a
- )>tmp
- (for /l "tokens=1* delims=:" %%a in ('sort /r tmp') do echo %%b)>2.txt
- del tmp
- start a.txt
复制代码
但是碰到大文件时,for两遍的效率会很低
作者: Hello123World 时间: 2011-4-27 13:40
- sort /r 111.txt >hello.txt
- start "" "hello.txt"
复制代码
作者: Batcher 时间: 2011-4-27 14:09
17# Hello123World
Windows的sort命令不会按照我们的想法去排序的
作者: cxypy 时间: 2011-5-1 15:12
顶顶顶顶顶顶顶
作者: 冷玉公子 时间: 2011-9-7 10:31
哈哈 虽然这个已经解决了但是看到了 还是要给个好方法的。- REM :: 打开变量延迟
- @Echo Off&SetLocal EnableDelayedExpansion
-
- REM :: 设定一个增值变量值为0
- Set Varn=0
-
- REM :: 首次循环判断文本中一共有多少行,并将每一行赋值于一个变量。
- For /f %%a in (1.txt) do (
- Set Vara=%%a
- Set /a Varn+=1
- Set "Var!Varn!=!Vara!"
- )
-
- REM :: 反过来将变量输出
- For /l %%b in (%Varn%,-1,1) do (
- Echo !Var%%b!
- )
- Pause
复制代码
不管文本中有多少行,如果行的内容比较复杂的话就要在第一个循环的For命令加上tokens=*参数
作者: FOR 时间: 2011-10-4 23:26
- gawk "{a[NR]=$0}END{for(i=NR;i>=1;i--)print a[i]}" a.txt
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |