中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]分割TXT文档:每6万行生成一个新的TXT
« [1] [2] »
作者:
标题: [求助]分割TXT文档:每6万行生成一个新的TXT 上一主题 | 下一主题
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
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 5 楼』:  

echo这个效率低得无法接受

用more+findstr能好些



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
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
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
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
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: