用于在行分隔符后插入行号的批处理文件

时间:2016-10-14 21:42:07

标签: batch-file count insert edi rownum

任何帮助将不胜感激!提前谢谢

我有一个EDI文件,我收到的状态是〜的行分隔符和*

的列分隔符

该文件基本上可以包含任意数量的行和列,但它按特定顺序排列,并且没有行号。当我将其导入数据库时​​,它不会按顺序导入,因此我失去了导入数据的所有含义。我试图在每个〜之后添加一个增量计数,然后是一个列分隔符* {〜#*}

如果文件包含一行:

  

〜ISA ***〜HL ***〜NM1 ***〜NM1 ***

我希望它的输出看起来像:

  

〜1 * *** ISA〜2 * HL ***〜3 * NM1 ***〜4 * NM1 ***

我正在看这篇文章中的Aacini代码 https://stackoverflow.com/a/19796067/6935730

这似乎与我想要它做的非常接近,但是我不确定如何让它在字符串(〜)旁边插入(第一次出现和*)所有文件自上次运行批处理以来已更新的目录。特别是对于c:\ whiskers \ test.txt

@echo off
setlocal EnableDelayedExpansion
set /a count = 0
for /f "delims=" %%a in (dir "%~1" /a:-d /b') do (
   for /F "delims=" %%b in ('find %2 ^< "%%a"') do call :next "%%b" "%~2" )
echo found %count% occurrences of "%~2"
pause
GOTO:EOF
:next
set num=0
set "line=%~1"
:nextMatch
   set "line2=!line:*%~2=!"
   if "!line2!" equ "!line!" goto endMatchs
   set /A num+=1
   set "line=!line2!"
if defined line goto nextMatch
:endMatchs
set /a count=count+num

:: EDIT ::

这是一个文件的片段,没有组织。我用管道替换了所有的*,以使其在帖子中显得正常。

  

ISA | 00 | | 00 | | ZZ | 77045 | ZZ | 100800
  | 16105 | 138 | ^ | 00501 | 006628 | 0 | P |:〜GS | HB | 77045 | 10014800 | 2061005 | 1638 | 1519300 | X | 005X279A1〜ST | 271 | 157200 | 0051X2791〜BHT | 0022 | 11 | 1572 | 201005 | 16850〜HL | 1 || 20 | 1〜NM1 | PR | 2 | WA   状态DSHS ||||| PI | 7745~PER | IC | WA State DSHS Provider   关系| TE | 800222~HL | 2 | 1 | 21 | 1~NM1 | 1P | 2 |人类中心   SERVICES ||||| XX | 1053220〜HL | 3 | 2 | 2 | 0〜TRN | 2 | 575 | 91059822〜NM1 | IL | 1 | WASR | |||| ERA MI | 10182WA〜REF | SY | 2191128 〜REF | HJ | 050526〜REF | N6 | ENG-ENGLISH〜REF | 18 | 130-WASHCAP   CENTRAL UNIT~REF | IF | 042-KING NORTH   CSO〜N3 | CY | 017-KING〜DMG | D8 | 197215 | F〜DTP | 291 | RD8 | 20105-2016105〜EB | 1个| IND | 1 ^ 3 ^ 3 ^ 3 ^ 4 ^ 8 ^ 0 ^ 6 ^ 8 ^ 9 ^ AL ^ MH ^ UC | MC | RAC = 1105 / BSP = CNP〜REF | M7 | 01202〜REF | 6P | S01 | 6P    - ACES覆盖范围组代码~DTP | 291 | RD8 | 201201-299931~MSG |根据可用信息,这是客户截至此日期的资格   在这   时间〜EB | A | IND | 30 | MC | RAC = 105 / BSP = CNP ||| 0〜EB | B | IND | 30 | MC | RAC = 115 / BSP = CNP || 0〜EB | C | IND | 30 | MC | RAC = 115 / BSP = CNP || 0〜EB | MC | IND || HM〜DTP | 291 | RD8 | 201301-299231〜LS | 210〜NM1 | Y2 | 2 |特大   县行为健康组织||||| PI | 1050201~PER | IC | KING   县行为健康   ORGANIZATION | TE | 8008049〜LE | 2120〜EB | MC | IND || HM〜DTP | 291 | RD8 | 20101-29991〜LS | 210〜NM1 | Y2 | 2 |协调   关心健康的选择   盲/残疾||||| PI | 201599904~PER | IC | COORDINATED CARE HEALTHY   OPTIONS   BLIND / DISABLED | TE | 8776613〜LE | 21〜HL | 4 | 2 | 22 | 0〜TRN | 2 | 578 | 9149822〜NM1 | IL | 1 |巴林石-BAEY | MA |百灵||| MI | 10080WA〜 REF | SY | 53052〜REF | HJ | 004995〜REF | N6 | ENG-ENGLISH〜REF | 18 | 182-HCA   西北〜REF | IF | 02-奥德伍德   CSO〜N3 | CY | 031-斯诺克米西〜DMG | D8 | 1990 | F〜DTP | 291 | RD8 | 21005-201615〜EB | 1个| IND | 1 ^ 0 ^ 3 ^ 35 ^ 4 ^ 48 ^ 5 ^ 6 ^ 88 ^ 8 ^ AL ^ MH ^ UC | MC | RAC = 12 / BSP = ABP〜REF | 6P | N05 | 6P    - ACES覆盖组代码~REF | M7 | 02701~DTP | 291 | RD8 | 20001-29991~MSG |这是客户端   根据此处提供的信息,截至此日期的资格   时间〜EB | A | IND | 30 | MC | RAC = 12 / BSP = ABP ||| 0〜EB | B | IND | 30 | MC | RAC = 1201 / BSP = ABP || 0〜EB | C | IND | 30 | MC | RAC = 1201 / BSP = ABP || 0〜EB | MC | IND || HM〜DTP | 291 | RD8 | 20101-29991〜LS | 2120〜NM1 | Y2 | 2 |北   健全行政卫生组织||||| PI | 105020901~

这是按行分隔后组织的数据。理想情况下,它会在每行的开头有一个行号,后跟另一个管道,但不需要在下面显示的行间隔。

  

ISA | 00 | | 00 | | ZZ | 77045 | ZZ | 100800
  | 16105 | 138 | ^ | 00501 | 006628 | 0 | P |:
  GS | HB | 77045 | 10014800 | 2061005 | 1638 | 1519300 | X | 005X279A1
  ST | 271 | 157200 | 0051X2791 BHT | 0022 | 11 | 1572 | 201005 | 16850 HL | 1 || 20 | 1
  NM1 | PR | 2 | WA State DSHS ||||| PI | 7745 PER | IC | WA State DSHS Provider   关系| TE | 800222 HL | 2 | 1 | 21 | 1 NM1 | 1P | 2 |人类中心   服务||||| XX | 1053220 HL | 3 | 2 | 2 | 0 TRN | 2 | 575 | 91059822
  NM1 | IL | 1 | WASR | ERA |||| MI | 10182WA REF | SY | 2191128 REF | HJ | 050526
  REF | N6 | ENG-ENGLISH REF | 18 | 130-WASHCAP CENTRAL UNIT REF | IF | 042-KING   北CSO N3 | CY | 017-KING DMG | D8 | 197215 | F
  DTP | 291 | RD8 | 20105-2016105
  EB | 1个| IND | 1 ^ 3 ^ 3 ^ 3 ^ 4 ^ 8 ^ 0 ^ 6 ^ 8 ^ 9 ^ AL ^ MH ^ UC | MC | RAC = 1105 / BSP = CNP
  REF | M7 | 01202 REF | 6P | S01 | 6P - ACES覆盖范围组代码
  DTP | 291 | RD8 | 201201-299931 MSG |这是客户的资格   此日期,基于此时可用的信息
  EB | A | IND | 30 | MC | RAC = 105 / BSP = CNP ||| 0 EB | B | IND | 30 | MC | RAC = 115 / BSP = CNP || 0   EB | C | IND | 30 | MC | RAC = 115 / BSP = CNP || 0 EB | MC | IND || HM
  DTP | 291 | RD8 | 201301-299231 LS | 210 NM1 | Y2 | 2 | King County Behavioral   卫生组织||||| PI | 1050201 PER | IC | KING COUNTY BEHAVALAL   健康组织| TE | 8008049 LE | 2120 EB | MC | IND || HM
  DTP | 291 | RD8 | 20101-29991 LS | 210 NM1 | Y2 | 2 | Coordinated Care Healthy   选项盲/禁用||||| PI | 201599904 PER | IC | COORDINATED CARE   健康选择盲/禁用| TE | 8776613 LE | 21 HL | 4 | 2 | 22 | 0
  TRN | 2 | 578 | 9149822 NM1 | IL | 1 | BALIN-BAEY | MA | J ||| MI | 10080WA
  REF | SY | 53052 REF | HJ | 004995 REF | N6 | ENG-ENGLISH REF | 18 | 182-HCA   西北REF | IF | 02-ALDERWOOD CSO N3 | CY | 031-SNOHOMISH
  DMG | D8 | 1990 | F DTP | 291 | RD8 | 21005-201615
  EB | 1 | IND | 1 ^ 0 ^ 3 ^ 35 ^ 4 ^ 48 ^ 5 ^ 6 ^ 88 ^ 8 ^ AL ^ MH ^ UC | MC | RAC = 12 / BSP = ABP
  REF | 6P | N05 | 6P - ACES覆盖范围代码REF | M7 | 02701
  DTP | 291 | RD8 | 20001-29991 MSG |这是客户的资格   此日期,基于此时可用的信息
  EB | A | IND | 30 | MC | RAC = 12 / BSP = ABP ||| 0 EB | B | IND | 30 | MC | RAC = 1201 / BSP = ABP || 0   EB | C | IND | 30 | MC | RAC = 1201 / BSP = ABP || 0 EB | MC | IND || HM
  DTP | 291 | RD8 | 20101-29991 LS | 2120 NM1 | Y2 | 2 | North Sound Admin   行为健康组织||||| PI | 105020901

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
:: read filenames from source directory (raw files)
FOR /f "delims=" %%a IN (
 'dir /b /a-d "%sourcedir%\*.txt" '
 ) DO (
 REM if the filename exists in the destination, it's been processed
 IF NOT EXIST "%destdir%\%%a" (
  FOR /f "delims=" %%b IN ('type "%sourcedir%\%%a"') DO (
   SET /a linecount=0
   SET "line=%%b"
   SET "newline="
   CALL :process
  ) >"%destdir%\%%a"
 )
)

GOTO :EOF

:process
IF NOT DEFINED line ECHO %newline%&GOTO :EOF 
SET /a linecount+=1
FOR /f "tokens=1*delims=~" %%r IN ("%line%") DO (
 SET "newline=%newline%~%linecount%*%%r"
 SET "line=%%s"
)
GOTO process

您需要更改sourcedirdestdir的设置以适合您的具体情况。

可悲的是,您提供的数据很少解释。如果输出小于~8K,此过程应与您提供的数据一起使用。您没有说明数据是否真的在一行中作为输入,或者您想要一行输出(这是该过程将产生的)。如果每个逻辑输入行需要一行输出,则需要进行小的调整。

您尚未说明如何确定文件是否已被处理 - 由于未处理和处理的文件的表观数据内容可能相同,因此无法通过分析文件中的数据来确定。

我选择将输入数据和输出保存在不同的目录中。以这种方式,所需要的只是查看文件是否存在于(已处理)或仅存在于源(新)中。因此,%%a依次设置为来自源的每个文件名,如果文件不在输出目录中,则处理该文件。

处理很简单 - 将文件内容分配给line,然后使用:process使用~对行进行分区并循环,直到没有剩余的行内容为止。

由于这是批处理,因此可能会对某些符号表现出敏感度。