大家好,我有一个问题。 我有一个每天从外部公司生成的自动txt文件。当我想将它加载到我的系统中时,我有一个错误,因此最终用户需要手动重写文件。
所以我需要创建一个具有以下目标的脚本。
以:86:/TYPE/0040/
我需要将/TYPE/0040
替换为以/OCMT
开头的下一行的值
例如
86:/TYPE/0040/VOR ETRANGE / ==> 86:/OCMT/EUR2405,/VOR ETRANGE /
非常感谢任何支持 脚本必须在Windows操作系统上运行。
这是该文件的一个示例,其中我有超过2000行
##################
:86:/TYPE/0040/VOR ETRANGE /
/ORDP/GALAK CHEZ MAMANLDA
/ORDP/PT
/REMI/TOTOT TATA
/OCMT/EUR2405,/
/EFEE/EUR0,/
:86:/TYPE/0568/VOR/
/REMI//ADV/260050000002 15.1.2015
/ETEI/7026150001
/ORDP/SOC DES POUBELLES
:61:1000000005C20546,28NTRFNONREF//15014215
:86:/TYPE/0568/VOR /
/REMI/00000 0000000 0000000
/ETEI/VIREMENT OREXAD
/ORDP/ORETOPEZZ
:86:/TYPE/0040/VOR toto/
/ORDP/ADVANCED +
/ORDP/US
/REMI/200000000559ISCW APDORTSB
/OCMT/USD37500,/
/EFEE/EUR0,/
##################
答案 0 :(得分:0)
我想我能成功!它是纯windows cmd版本(涉及No powershell)。这是一个不重要的解决方案(我假设输入文件名为conv.txt
):
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
REM Read all lines and store OCMT values in environment variables
set REF=
REM set line=0
FOR /F "tokens=1,2,3 delims=/" %%i IN (conv.txt); DO (
SET /A line += 1
REM echo !line!: %%i, %%j, %%k
set type=%%i
if "!type:~0,1!" == ":" set REF=
IF "%REF%" == "" (
IF "%%i" == ":86:" IF "%%j" == "TYPE" IF "%%k" == "0040" set REF=!line!
)
if "%%i" == "OCMT" set OCMT_!!REF!!=%%j
)
REM Read all lines again and replace
set line=0
FOR /F "tokens=* delims=" %%i IN (conv.txt); DO (
SET /A line += 1
set LL=%%i
IF "!LL:~0,15!" == ":86:/TYPE/0040/" (
FOR /F "tokens=1* delims==" %%a IN ('set OCMT_!line!') DO (
set LL=:86:/OCMT/%%b/!LL:~15!
)
)
echo !LL!
)
输出:
##################
:86:/OCMT/EUR2405,/VOR ETRANGE /
/ORDP/GALAK CHEZ MAMANLDA
/ORDP/PT
/REMI/TOTOT TATA
/OCMT/EUR2405,/
/EFEE/EUR0,/
:86:/TYPE/0568/VOR/
/REMI//ADV/260050000002 15.1.2015
/ETEI/7026150001
/ORDP/SOC DES POUBELLES
:61:1000000005C20546,28NTRFNONREF//15014215
:86:/TYPE/0568/VOR /
/REMI/00000 0000000 0000000
/ETEI/VIREMENT OREXAD
/ORDP/ORETOPEZZ
:86:/OCMT/USD37500,/VOR toto/
/ORDP/ADVANCED +
/ORDP/US
/REMI/200000000559ISCW APDORTSB
/OCMT/USD37500,/
/EFEE/EUR0,/
##################
它解析输入文件两次。第一个块读取文件并设置环境变量OCMT_<TYPE_LINE>=<OCMT LINE AMOUNT>
(例如OCMT_2=EUR2405,
)。在第二个块中,它再次找到以:86:/TYPE/0040/
开头的行。然后它取代:86:/OCMT/<OCMT LINE AMOUNT>/<rest of the line>
。
主要技巧是如何取回环境变量。它解决了cmd中调用FOR
的内部set
循环。
这不是一个完整的解决方案!并非所有可能的错误都经过检查和处理(例如,只有:86:/TYPE/0040/...
行可能包含OCMT
个子行?它是否有空行?),但它符合简要说明......
我希望这有帮助!