标题: 文本拆分专题(续)
[打印本页]
作者: wusongccb
时间: 2008-10-27 14:31
标题: 文本拆分专题(续)
按照版主要求,现将详细需求整理在此:
现有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读写,效率大大降低。
论坛高手如云,且不吝赐教,感激不尽!!
作者: lxmxn
时间: 2008-10-28 13:37
像这样的问题一般考虑用 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 ]