中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 文本拆分专题(续) 上一主题 | 下一主题
wusongccb
新手上路





积分 6
发帖 6
注册 2008-10-21
状态 离线
『楼 主』:  文本拆分专题(续)

按照版主要求,现将详细需求整理在此:

现有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读写,效率大大降低。

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

2008-10-27 14:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  

像这样的问题一般考虑用 VBS 或 awk,效率是一个重要问题。

下面这个不需要sed进行处理,直接命令行运行就行了。如果没有 gawk 可以自己下载个,论坛很多链接。
gawk -F"|" "{if($(117)~/^(110|210|310)/)print $0>>substr($(117),1,3)\".txt\" }" aaa.txt
[ Last edited by lxmxn on 2008-10-28 at 13:39 ]

2008-10-28 13:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: