Board logo

标题: 文本拆分专题(续) [打印本页]

作者: 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 ]