中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-23 11:54
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,273 会员排行
DOS批处理 & 脚本技术(批处理室) » 请求高手解答 我的 难题(文本拆分)
可打印版本  4,427 / 24
第1楼 wusongccb 发表于 2008-10-22 10:36
新手上路 发帖 6 积分 6
请求高手解答 我的 难题(文本拆分)
按照版主要求,现将详细需求整理在此:

现有16G的文本文件,有130个字段,需要拆分成若干文件。

拆分规则: 按照 第117个字段的前三位命名并拆分。

我已研究出一个半成品代码,代码如下:

@echo off
sed.exe -f sed.txt aaa.txt > temp.txt
for /f "tokens=1,2* delims=|" %%a in (temp.txt) do (
for /f "tokens=25* delims=|" %%d in ("%%c") do (
for /f "tokens=25* delims=|" %%f in ("%%e") do (
for /f "tokens=25* delims=|" %%h in ("%%g") do (
for /f "tokens=25* delims=|" %%j in ("%%i") do (
for /f "tokens=15 delims=|" %%l in ("%%k") do (
set "str=%%l"
setlocal enabledelayedexpansion
for %%z in (110 210 310) do (
if "!str:~,3!"=="%%z" (
>>%%z.txt echo %%a^|%%b^|%%c
)
)
endlocal
)
)
)
)
)
)

但是该代码有个缺陷,%%z 并不止上述“110 210 310”三个,因此不能如此枚举出来,而是能否直接用第117个字段的前三位来命名。

同时目前还发现另外一个问题:
文本文件中,有字段值为空,即两个管道符在一起(如:||),如此,FOR会认为所指定的字段并不在117位,程序默认空字段值不能赋值给一个变量,导致锁定第117个字段不准,因此我使用了个蠢办法,利用SED.EXE做一个全文本替换,将管道符“|”替换成空格+管道符(如:“ |”),如此就能锁定第117个字段,但是这样就会多一次I/O读写,效率大大降低。

论坛高手如云,且不吝赐教,感激不尽!!

[ Last edited by wusongccb on 2008-10-27 at 10:55 ]
第2楼 moniuming 发表于 2008-10-22 11:02
银牌会员 发帖 574 积分 1,335 来自 广西
第3楼 tireless 发表于 2008-10-22 13:29
银牌会员 发帖 1,122 积分 2,025


有个疑问是,为什么:

set str=%%b & set filename=!str:~,3!
echo %%a^|%%b^|%%c>>!filename!.txt

不能换成:

set str=%%b
echo %%a^|%%b^|%%c>>!str:~,3!.txt
第4楼 HAT 发表于 2008-10-22 14:00
版主 发帖 5,017 积分 9,023
Re 2楼
这样是不是要好些?
第5楼 moniuming 发表于 2008-10-22 14:12
银牌会员 发帖 574 积分 1,335 来自 广西
回3楼
经测试,确实不行...

[ Last edited by moniuming on 2008-10-22 at 14:23 ]
第6楼 26933062 发表于 2008-10-22 14:37
银牌会员 发帖 879 积分 2,268
这样是否更好
:
第7楼 tireless 发表于 2008-10-22 14:46
银牌会员 发帖 1,122 积分 2,025
Re 4 楼
@echo off
for /f "tokens=1,2* delims=|" %%a in (aaa.txt) do (
set "str=%%b"
setlocal enabledelayedexpansion
for %%i in (110 210 310) do (
if "!str:~,3!"=="%%i" (
>>%%i.txt echo %%a^|%%b^|%%c
)
)
endlocal
)


蓝色部分是不是放在 for 循环的外面好些?放在 for 循环里面的话,每套一次 for 循环,都进行 打开/关闭变量延迟扩展...
第8楼 HAT 发表于 2008-10-22 14:54
版主 发帖 5,017 积分 9,023
Re 3楼
看完这篇文章,不知是否有所启发:
第9楼 HAT 发表于 2008-10-22 14:55
版主 发帖 5,017 积分 9,023
Re 6楼
1. 这个方法3楼已经对提出疑问了。
2. 为何要坚持用type呢?
第10楼 moniuming 发表于 2008-10-22 14:57
银牌会员 发帖 574 积分 1,335 来自 广西
回6楼
不行,你试过了吗?
'3.txt' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'3.txt' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'3.txt' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'3.txt' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'3.txt' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'3.txt' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
第11楼 HAT 发表于 2008-10-22 14:59
版主 发帖 5,017 积分 9,023
Re 7楼
放在哪里更好呢?嗯,还是各取所需吧^_^
第12楼 wusongccb 发表于 2008-10-22 18:29
新手上路 发帖 6 积分 6
非常感谢各位高手
输入的文本是追加式的,能改成替换方式的吗
第13楼 wusongccb 发表于 2008-10-22 18:32
新手上路 发帖 6 积分 6
还有我处理的 aaa.txt有 16个G这么大,用2楼的脚本可以吗?
第14楼 wusongccb 发表于 2008-10-22 18:34
新手上路 发帖 6 积分 6
高手如云,真是个好论坛
第15楼 wusongccb 发表于 2008-10-22 18:51
新手上路 发帖 6 积分 6
还有个巨大的困难,各位高手

实际情况是 分隔符的 第 117个字段(例子是第2个字段),发掘26个字段后不知道用什么字母来代替
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023