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


  Quote:
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


  Quote:
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


  Quote:
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


  Quote:
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 ]