中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-08 23:20
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]分割TXT文档:每6万行生成一个新的TXT 查看 2,157 回复 17
楼 主 [求助]分割TXT文档:每6万行生成一个新的TXT 发表于 2008-05-30 17:30 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
如何将一个很大的TXT文档,
每6万行自动生成一个新的TXT ?
严重求助,谢谢各位.


───────────────── 版务记录 ─────────────────
执行:HAT
操作:在帖子标题中增加搜索关键字
说明:原标题"严重求助: 分割TXT文档"不利于论坛搜索
───────────────── 版务记录 ─────────────────


[ Last edited by HAT on 2008-11-9 at 17:49 ]
2 发表于 2008-05-30 17:38 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
也就是说: 一个名为“原始.TXT”的文档中有几十万行,
自动将其划分为每个文档仅含6万行数据的
“原始_1.TXT”、“原始_2.TXT”、“原始_3.TXT”... 等
3 发表于 2008-05-30 17:47 ·  中国 广东 广州 移动
初级用户
积分 70
发帖 36
注册 2008-05-21 22:48
18年会员
UID 119349
性别 男
状态 离线
六万行,那是多大的文本了?
能不能用几个for,一个检测正在写入的文件的大小,另一个检行数,还有一个检生成的文件名?

本人新来...只学了一点C++,所以只有一个思路,不知道行不行.....见谅
4 发表于 2008-05-30 17:48 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线

@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
5 发表于 2008-05-30 17:53 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
echo这个效率低得无法接受

用more+findstr能好些
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
6 发表于 2008-05-30 18:01 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
效率不是问题,
多等等就行

可以用,非常感谢4楼的老兄!
7 发表于 2008-05-30 18:05 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by plp626 at 2008-5-30 17:53:
echo这个效率低得无法接受

用more+findstr能好些

我理解more只能忽略前面的行,并不能忽略后面的行啊,不管怎么样,愿闻其详,期待中。。。
批处理之家新域名:www.bathome.net
8 发表于 2008-05-30 18:08 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
这个问题用 sed 就应该是最佳选择了。
致精致简!
9 发表于 2008-05-30 21:39 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
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学习
10 发表于 2008-05-30 22:11 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
拙劣的 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 ]
致精致简!
11 发表于 2008-05-30 22:27 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
Originally posted by 26933062 at 2008-5-30 10:11 PM:
拙劣的 sed 用法,望高手指点。(假设有十万行)
发现太多的行,若是用more会出错,不知什么原因?

@echo off
:loop
set /a n=m+1,m+=60000,h+=1
sed -n ...


那可能不是more的原因,兄测试时有没用其他,比如findstr?findstr对字符是有较多限制的。。。

另外,sed有一个参数可以直接获得指定行之间的内容,是什么来着?
那位可以告知?
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
12 发表于 2008-05-30 22:49 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
gawk应该不是很慢……
gawk -vm=1 "{print $0 > m\".txt\";}NR%60000==0{m+=1}" yourfile
13 发表于 2008-05-30 23:01 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
sed -n "1,70000p" a.txt|more>b.txt
运行以上命令,发现到了65535行时就出现 (-- More -- ) 字样,且无法继续向b.txt写入内容。
在 65535 以前写入很快,大概只要几秒,sed 处理文本的速度是可观的。
致精致简!
14 发表于 2008-05-31 02:30 ·  中国 江苏 常州 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
我发现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
简单!简单!再简单!
15 发表于 2008-05-31 02:51 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
sed -n "1,3!d" a.txt|more
我运行此命令,没有任何显示?不知何故?
致精致简!
论坛跳转: