用文本替换数字

时间:2018-05-06 19:47:06

标签: batch-file batch-processing

我是编码世界的新手,我需要你的帮助来创建一个批处理或VB脚本来用静态文本替换数字; 我收到以下文件

enter image description here

我需要更换" TP"和" 123456678"使用静态文本" LL"," ONRECORD"在比较第二个文件

之后

enter image description here

行号。有人已经完成了这个要求吗?

我没有任何代码,因为我是一只新蜜蜂,在这里学习。

谢谢。

> File-1
099,3,IZM,97101122400,,PAT,HYANGLI PARK,1100/,TP,98379108610,4000.00,A
099,3,IZM,97101122426,,PAT,NAWAZ SHARIFF,1100/,TP,98639269764,1500.00,A
099,3,IZM,97101122624,,PAT,ABDUL WAHID,1100/,TP,98409328386,6500.00,A
099,3,IZM,97101122699,,PAT,SHINE C B,1100/,TP,96805840301,1500.00,A
099,3,IZM,97101122715,,PAT,HUPING LI,1100/,TP,98217686108,1500.00,A
099,3,IZM,97101123051,,PAT,CHERYL G P,1100/,TP,97970379422,2000.00,A
> 

> File-2 
    > DER,000330,CAD-SEC-10,10-ID NUMBER IS NOT VALID
    > DER,000333,CAD-SEC-10,10-ID NUMBER IS NOT VALID
    > DER,000339,CAD-SEC-10,10-ID NUMBER IS NOT VALID
    > DER,000377,CAD-SEC-10,10-ID NUMBER IS NOT VALID
    > DER,000462,CAD-SEC-10,10-ID NUMBER IS NOT VALID
    > DER,000755,CAD-SEC-10,10-ID NUMBER IS NOT VALID
    > DER,000820,CAD-SEC-10,10-ID NUMBER IS NOT VALID
    > DER,001055,CAD-SEC-10,10-ID NUMBER IS NOT VALID

samplecodepic1

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q50203863.txt"
SET "filename2=%sourcedir%\q50203863_2.txt"
SET "outfile=%destdir%\outfile.txt"
:: remove variables starting #
FOR  /F "delims==" %%a In ('set # 2^>Nul') DO SET "%%a="

:: Retrieve line numbers from file2.

FOR /f "usebackqtokens=1,2delims=," %%a IN ("%filename2%") DO (
 REM token 1 (%%a) must be "DER", token 2 (%%b) contains line number
 REM set 'line' to zero-suppressed line number, then #linenumber to 'Y'
 IF "%%a"=="DER" SET /a line=1%%b %% 100000&SET "#!line!=Y"
)

(
REM number each line in [] with 'find'
REM then tokenise - %%a gets the number, %%b the line-contents
FOR /f "tokens=1*delims=[]" %%a IN ('type "%filename1%"^|find /n /v ""') DO (
 IF DEFINED #%%a (
  REM process if selected
  FOR /f "tokens=1-9,*delims=," %%g IN ("%%b") DO (
   REM Tokenise to %%g..%%p.
   REM if %%n is "TP" then replace else report
   IF "%%n"=="TP" (
    ECHO %%g,%%h,%%i,%%j,,%%k,%%l,%%m,LL,ONRECORD,%%p
   ) ELSE (
    ECHO ERROR - line %%a does NOT contain TP IN required column LINE OMITTED
   )
  )
 ) ELSE IF "%%b" neq "" (
  REM IF NOT selected, simply regurgitate it unless empty
  ECHO %%b
 )
)
)>"%outfile%"

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。 我使用了名为q50203863.txt q50203863_2.txt的文件,其中包含一些虚拟数据供我测试。

生成定义为%outfile%

的文件

大部分操作方法都包含在评论中。

请不要链接到场外资源,因为无法保证这些链接对未来读者有效。

请将真实的原始数据逐字发布到您的问题中,以便测试生成的代码,而不会增加为测试目的生成数据的额外问题。

所以不是代码编写服务,但它是凌晨5点,我 BORED

由于缺乏规范,我选择检查TP的替换。

你的例子第5栏是空的(连续两个逗号)引起人们对这些事情的注意是很重要的。如果第5列总是为空,则需要采用不同的方法,因为for/f标记是针对分隔符序列而不是单独的分隔符执行的。

调试方法:

鉴于您正在为每个文件使用一小部分数据进行测试,那么第二个文件中的行号必须与第一个文件中需要更改的行相对应。在发布的数据中,选择了行300,333等,但样本数据仅包含6行,编号为1-6,因此测试将找不到所需的行并简单地重新调整原始文件。

可能性1:

如果您使用的是cygwin,那么cygwin安装程序会优先考虑Windows版本的* {1}}的* nix版本。

要调用Windows版本,您需要指定find的绝对路径,通常为find.exeC:\Windows\System32\find.exe

如果这不能解决问题,那么我们需要进一步调查:

C:\Windows\SysWOW64\find.exe

@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET "sourcedir=U:\sourcedir" SET "destdir=U:\destdir" SET "filename1=%sourcedir%\q50203863.txt" SET "filename2=%sourcedir%\q50203863_2.txt" SET "outfile=%destdir%\outfile.txt" :: remove variables starting # FOR /F "delims==" %%a In ('set # 2^>Nul') DO SET "%%a=" :: Retrieve line numbers from file2. FOR /f "usebackqtokens=1,2delims=," %%a IN ("%filename2%") DO ( REM token 1 (%%a) must be "DER", token 2 (%%b) contains line number REM set 'line' to zero-suppressed line number, then #linenumber to 'Y' ECHO "%%a" "%%b" IF "%%a"=="DER" SET /a line=1%%b %% 100000&SET "#!line!=Y" ) REM The next line should list all of the lines-required-to-be-changed REM in the format "#linenumber=Y" SET # ( REM number each line in [] with 'find' REM then tokenise - %%a gets the number, %%b the line-contents FOR /f "tokens=1*delims=[]" %%a IN ('type "%filename1%"^|find /n /v ""') DO ( IF DEFINED #%%a ( REM process if selected ECHO Line %%a found for analysis>con FOR /f "tokens=1-9,*delims=," %%g IN ("%%b") DO ( REM Tokenise to %%g..%%p. REM if %%n is "TP" then replace else report IF "%%n"=="TP" ( ECHO Line %%a has TP in required column and should be changed>con ECHO %%g,%%h,%%i,%%j,,%%k,%%l,%%m,LL,ONRECORD,%%p ) ELSE ( ECHO Line %%a does not have TP in required column>con ECHO ERROR - line %%a does NOT contain TP IN required column LINE OMITTED ) ) ) ELSE IF "%%b" neq "" ( REM IF NOT selected, simply regurgitate it unless empty ECHO %%b ) ) )>"%outfile%" PAUSE GOTO :EOF 结尾的新行(重定向到控制台,覆盖重定向到"%outfile%")应报告任何"点击"

仅当您使用点击和傻笑来执行批处理时,才需要>con行。它保持窗口打开,以便可以看到报告。

[201805170055]我在第二个pause循环中添加了一个新行ECHO "%%a" "%%b",以显示感兴趣的列的内容。这应该显示像for /f这样的行列表。请描述显示的结果。