Board logo

标题: [求助]分割TXT文档:每6万行生成一个新的TXT [打印本页]

作者: youaoyi     时间: 2008-5-30 17:30    标题: [求助]分割TXT文档:每6万行生成一个新的TXT
如何将一个很大的TXT文档, 每6万行自动生成一个新的TXT ? 严重求助,谢谢各位. ───────────────── 版务记录 ───────────────── 执行:HAT 操作:[2008-11-09]在帖子标题中增加搜索关键字 说明:原标题"严重求助: 分割TXT文档"不利于论坛搜索 ───────────────── 版务记录 ───────────────── [ Last edited by HAT on 2008-11-9 at 17:49 ]

作者: youaoyi     时间: 2008-5-30 17:38
也就是说: 一个名为“原始.TXT”的文档中有几十万行, 自动将其划分为每个文档仅含6万行数据的 “原始_1.TXT”、“原始_2.TXT”、“原始_3.TXT”... 等

作者: andison625     时间: 2008-5-30 17:47
六万行,那是多大的文本了? 能不能用几个for,一个检测正在写入的文件的大小,另一个检行数,还有一个检生成的文件名? 本人新来...只学了一点C++,所以只有一个思路,不知道行不行.....见谅

作者: bat-zw     时间: 2008-5-30 17:48
@echo off&setlocal enabledelayedexpansion
set m=1
for /f "delims=" %%i in (原始.TXT) do (
     set /a n+=1
     if !n! leq 60000 echo %%i>>原始_!m!.txt
     if !n! equ 60000 set n=0&set /a m+=1
)
echo 终于搞定!
pause>nul
ps:几十万行,真不知道能不能处理完。 [ Last edited by zw19750516 on 2008-5-30 at 05:49 PM ]

作者: plp626     时间: 2008-5-30 17:53
echo这个效率低得无法接受 用more+findstr能好些

作者: youaoyi     时间: 2008-5-30 18:01
效率不是问题, 多等等就行 可以用,非常感谢4楼的老兄!

作者: bat-zw     时间: 2008-5-30 18:05
Originally posted by plp626 at 2008-5-30 17:53: echo这个效率低得无法接受 用more+findstr能好些
我理解more只能忽略前面的行,并不能忽略后面的行啊,不管怎么样,愿闻其详,期待中。。。

作者: 26933062     时间: 2008-5-30 18:08
这个问题用 sed 就应该是最佳选择了。

作者: plp626     时间: 2008-5-30 21:39
Originally posted by zw19750516 at 2008-5-30 06:05 PM: 我理解more只能忽略前面的行,并不能忽略后面的行啊,不管怎么样,愿闻其详,期待中。。。
我举个例子用more+findstr获得一个文本的前10行
more +10 a.txt>tmp
findstr/vbeg:tmp a.txt&echo\
这个速度要比现今流行的for+set/a+if+echo 快多了,至于获得中间的行原理差不多,还是在tmp上用findstr 但不通用,大家注意,后面出现与前面一样的行就过滤了 [ Last edited by plp626 on 2008-5-30 at 09:49 PM ]

作者: 26933062     时间: 2008-5-30 22:11
拙劣的 sed 用法,望高手指点。(假设有五十万行)
@echo off
:loop
set /a n=m+1,m+=60000,h+=1
sed -n "%n%,%m%p" a.txt|more >a%h%.txt
if %m% lss 500000 goto loop
pause
[ Last edited by 26933062 on 2008-5-30 at 10:22 PM ]

作者: plp626     时间: 2008-5-30 22:27
Originally posted by 26933062 at 2008-5-30 10:11 PM: 拙劣的 sed 用法,望高手指点。(假设有十万行) 发现太多的行,若是用more会出错,不知什么原因? [code] @echo off :loop set /a n=m+1,m+=60000,h+=1 sed -n ...
那可能不是more的原因,兄测试时有没用其他,比如findstr?findstr对字符是有较多限制的。。。 另外,sed有一个参数可以直接获得指定行之间的内容,是什么来着? 那位可以告知?

作者: lxmxn     时间: 2008-5-30 22:49
gawk应该不是很慢……
gawk -vm=1 "{print $0 > m".txt";}NR%60000==0{m+=1}" yourfile

作者: 26933062     时间: 2008-5-30 23:01
sed -n "1,70000p" a.txt|more>b.txt 运行以上命令,发现到了65535行时就出现 (-- More -- ) 字样,且无法继续向b.txt写入内容。 在 65535 以前写入很快,大概只要几秒,sed 处理文本的速度是可观的。

作者: terse     时间: 2008-5-31 02:30
我发现sed 这样的参数 貌似效率要高点 是真的吗?前面取行要慢点
for /f %%i in ('find/c /v "" ^<a.txt') do set s=%%i
:loop
set /a n=m+1,m+=60000,h+=1
sed -n "%n%,%m%!d" a.txt|more>a_%h%.txt
if %m% lss %s% goto loop
pause

作者: 26933062     时间: 2008-5-31 02:51
sed -n "1,3!d" a.txt|more 我运行此命令,没有任何显示?不知何故?

作者: plp626     时间: 2008-5-31 03:08
刚学到的: sed 显示文本的前10行
sed 11,$d a.txt
(就是让光标停在第11行)

作者: WANKOILZ     时间: 2008-5-31 12:29
学习9楼的 "用more+findstr获得一个文本的前10行"!

作者: terse     时间: 2008-5-31 13:01
Originally posted by 26933062 at 2008-5-31 02:51: sed -n "1,3!d" a.txt|more 我运行此命令,没有任何显示?不知何故?
是我的错 去掉-n就可以 但速度基本一样 理论上是这样快点但我测试都差不多: 对sed命令不熟悉 行数可以这样sed -n "$=" a.txt 这样比find快多 set /a n=m+1,m+=6000,h+=1,mn=m+1 sed -n "%mn%q;%n%,%m%p" a.txt|more >b%h%.txt RE:16楼 显示前10行 也可以这样:sed 10q a.txt q是退出的意思吧 [ Last edited by terse on 2008-5-31 at 05:29 PM ]