任何帮助将不胜感激!提前谢谢
我有一个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
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
可悲的是,您提供的数据很少解释。如果输出小于~8K,此过程应与您提供的数据一起使用。您没有说明数据是否真的在一行中作为输入,或者您想要一行输出(这是该过程将产生的)。如果每个逻辑输入行需要一行输出,则需要进行小的调整。
您尚未说明如何确定文件是否已被处理 - 由于未处理和处理的文件的表观数据内容可能相同,因此无法通过分析文件中的数据来确定。
我选择将输入数据和输出保存在不同的目录中。以这种方式,所需要的只是查看文件是否存在于(已处理)或仅存在于源(新)中。因此,%%a
依次设置为来自源的每个文件名,如果文件不在输出目录中,则处理该文件。
处理很简单 - 将文件内容分配给line
,然后使用:process
使用~
对行进行分区并循环,直到没有剩余的行内容为止。
由于这是批处理,因此可能会对某些符号表现出敏感度。