批处理文件文本处理 - 查找连续数字

时间:2012-05-17 03:44:34

标签: batch-file range sequence

我有一个文本文件,其中包含PBX的电话长途交换信息。 输入文件包含:

sourceNPA,srcNNX,DestinationNPA,destNNX
954,327,954,201
954,327,954,202
954,327,954,203
954,327,954,210 
954,327,954,212
954,327,954,213 
954,327,954,214 
etc...

出于公司政策原因,我不能使用任何VBS或Windows批处理(不仅仅是因为我不是编码员)。我希望手动完成这些操作,但有43000或更多要转换为范围。

我需要读取给定文本文件的每一行,看看dNPA和dNXX(每行中的最后两个arg)是否是连续的,如果是,则确定范围,以便输出列表在输出中如下所示: / p>

954,327,954,201,203
954,327,954,210,210
954,327,954,212,214
etc...

我已经尝试过研究数组的使用,并尝试将一行读入临时文件,但必须有一个技巧。

我一直在修修补补,但几乎没有表现出来:

@echo off
setlocal enabledelayedexpansion
set lineNumber=1
if exist outputFile.txt del outputFile.txt

for /f "tokens=1-6 delims=,;" %%a in (inputFile.txt) do call :process %%a %%b %%c %%d
:EOF

:process
set line!linenumber!SrcNPA=%1
set line!linenumber!SrcNNX=%2
set line!linenumber!destNPA=%3
set line!linenumber!destNNX=%4
REM then intended to compare the values but I'm stuck
REM I want to compare the last arugment of each line to the same
REM same argument in the next line read, and if its sequential 
REM then set the start the range and when the comaparison is no longer
REM consecutive set the top of the range andn then write that range to output
set /a lineNumber+=1

1 个答案:

答案 0 :(得分:2)

您需要对第4个数字进行数学运算以查找连续值。据推测,一些数字可以从零开始。这会导致批处理解析问题,因为SET / A假定以0开头的数字是八进制表示法。因此需要额外的工作来防止这种情况。

假设输入文件是预先排序的,则以下内容应该有效。

@echo off
setlocal enableDelayedExpansion
set "current="
set "next="
(
  for /f "tokens=1-4 delims=," %%A in (testFile.txt) do (
    set /a "num=10000%%D%%10000"
    if "!current!,!next!"=="%%A,%%B,%%C,!num!" (
      set "end=%%D"
      set /a "next+=1"
    ) else (
      if defined current echo !current!,!start!,!end!
      set "current=%%A,%%B,%%C"
      set "start=%%D"
      set "end=%%D"
      set /a "next=num+1"
    )
  )
  if defined current echo !current!,!start!,!end!
)>global_new.txt

如果输入文件没有预先排序,那么只要每列的宽度不变,就可以在FOR / F中使用SORT。

for /f "tokens=1-4 delims=," %%A in ('sort testFile.txt') do (

如果列的宽度不是常量且文件未预先排序,则脚本会变得复杂得多。我建议在那时切换到VBS。无论如何,VBS将会有更好的表现。