簡體   English   中英

用子行中的字符串替換文件中的字符串

[英]Replace string in a file with string from sub line

大家好,我有一個問題。 我每天都有一個由外部公司生成的自動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,/
##################

我想我能做到! 它是純 版本(不涉及 )。 這不是一個簡單的解決方案(我假設輸入文件名為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>

主要技巧是如何獲取環境變量。 它是通過在 set的內部FOR循環調用解決的。

這不是一個完整的解決方案! 並非所有可能的錯誤都得到檢查和處理(例如,僅:86:/TYPE/0040/...行可能包含OCMT行?行是否可以包含空行?),但它符合簡要說明...

我希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM