|
youaoyi
初级用户
积分 154
发帖 67
注册 2007-10-31
状态 离线
|
『楼 主』:
[求助]分割TXT文档:每6万行生成一个新的TXT
如何将一个很大的TXT文档,
每6万行自动生成一个新的TXT ?
严重求助,谢谢各位.
───────────────── 版务记录 ─────────────────
执行:HAT
操作:[2008-11-09]在帖子标题中增加搜索关键字
说明:原标题"严重求助: 分割TXT文档"不利于论坛搜索
───────────────── 版务记录 ─────────────────
[ Last edited by HAT on 2008-11-9 at 17:49 ]
|
|
2008-5-30 17:30 |
|
|
youaoyi
初级用户
积分 154
发帖 67
注册 2007-10-31
状态 离线
|
『第
2 楼』:
也就是说: 一个名为“原始.TXT”的文档中有几十万行,
自动将其划分为每个文档仅含6万行数据的
“原始_1.TXT”、“原始_2.TXT”、“原始_3.TXT”... 等
|
|
2008-5-30 17:38 |
|
|
andison625
初级用户
积分 70
发帖 36
注册 2008-5-21
状态 离线
|
『第
3 楼』:
六万行,那是多大的文本了?
能不能用几个for,一个检测正在写入的文件的大小,另一个检行数,还有一个检生成的文件名?
本人新来...只学了一点C++,所以只有一个思路,不知道行不行.....见谅
|
|
2008-5-30 17:47 |
|
|
bat-zw
金牌会员
永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第
4 楼』:
@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 ]
|
批处理之家新域名:www.bathome.net |
|
2008-5-30 17:48 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
|
2008-5-30 17:53 |
|
|
youaoyi
初级用户
积分 154
发帖 67
注册 2007-10-31
状态 离线
|
『第
6 楼』:
效率不是问题,
多等等就行
可以用,非常感谢4楼的老兄!
|
|
2008-5-30 18:01 |
|
|
bat-zw
金牌会员
永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第
7 楼』:
Quote: | Originally posted by plp626 at 2008-5-30 17:53:
echo这个效率低得无法接受
用more+findstr能好些 |
|
我理解more只能忽略前面的行,并不能忽略后面的行啊,不管怎么样,愿闻其详,期待中。。。
|
批处理之家新域名:www.bathome.net |
|
2008-5-30 18:05 |
|
|
26933062
银牌会员
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
『第
8 楼』:
这个问题用 sed 就应该是最佳选择了。
|
致精致简! |
|
2008-5-30 18:08 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
9 楼』:
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 ]
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-5-30 21:39 |
|
|
26933062
银牌会员
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
『第
10 楼』:
拙劣的 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 ]
|
致精致简! |
|
2008-5-30 22:11 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
11 楼』:
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有一个参数可以直接获得指定行之间的内容,是什么来着?
那位可以告知?
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-5-30 22:27 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
12 楼』:
gawk应该不是很慢……
gawk -vm=1 "{print $0 > m\".txt\";}NR%60000==0{m+=1}" yourfile
|
|
2008-5-30 22:49 |
|
|
26933062
银牌会员
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
『第
13 楼』:
sed -n "1,70000p" a.txt|more>b.txt
运行以上命令,发现到了65535行时就出现 (-- More -- ) 字样,且无法继续向b.txt写入内容。
在 65535 以前写入很快,大概只要几秒,sed 处理文本的速度是可观的。
|
致精致简! |
|
2008-5-30 23:01 |
|
|
terse
银牌会员
积分 2404
发帖 946
注册 2005-9-8
状态 离线
|
『第
14 楼』:
我发现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
|
简单!简单!再简单! |
|
2008-5-31 02:30 |
|
|
26933062
银牌会员
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
『第
15 楼』:
sed -n "1,3!d" a.txt|more
我运行此命令,没有任何显示?不知何故?
|
致精致简! |
|
2008-5-31 02:51 |
|