Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件文本处理-查找连续数字_Batch File_Range_Sequence - Fatal编程技术网

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

Batch file 批处理文件文本处理-查找连续数字,batch-file,range,sequence,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批处理。我希望用手来做这

我有一个文本文件,其中包含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(每行最后两个参数)是否连续,如果连续,则确定范围,以便输入列表在输出中读取如下内容:

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

您需要在第四个数字上进行数学运算,以查找连续值。大概有些数字可以从零开始。这会导致批处理的解析问题,因为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的性能会好得多。

您需要对第四个数字进行数学运算,以查找连续的值。大概有些数字可以从零开始。这会导致批处理的解析问题,因为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将有更好的性能。

我不清楚您想要实现什么。我需要处理一个包含数字列表的文件,该列表的格式类似于列出的第一个序列,其中一些是连续的,并输出一个数字列表,其格式类似于连续序列中的第二个数字列表输入中的数字被转换为输出中的范围。代码示例很弱,但这就是我寻求建议的原因。我试过几种方法,但我想我在这里是在追根究底。我不清楚你想达到什么目的。我需要处理一个文件,其中包含一个数字列表,其格式类似于列出的第一个序列,其中一些是连续的,并输出一个数字列表,其格式类似于连续序列中的第二个数字列表输入中的数字被转换为输出中的范围。代码示例很弱,但这就是我寻求建议的原因。我试过好几种方法,但我想我在追我的尾巴。太好了!它就像你发布的那样工作。这里有一些我以前从未见过的技巧。学习的好东西。明亮的所有的输入都将按照描述的格式进行格式化,这样整个作业都可以使用。。。这将节省我几个小时,如果不是更长的话。谢谢你的快速建议。太好了!它就像你发布的那样工作。这里有一些我以前从未见过的技巧。学习的好东西。明亮的所有的输入都将按照描述的格式进行格式化,这样整个作业都可以使用。。。这将节省我几个小时,如果不是更长的话。谢谢你的快速建议。