首页 > 解决方案 > 用文本替换数字

问题描述

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

在此处输入图像描述

在比较第二个文件后,我需要用静态文本“LL”、“ONRECORD”替换“TP”和“123456678”

在此处输入图像描述

行号。有人经历过这个要求吗?

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

谢谢你。

> 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

示例codepic1

标签: batch-filebatch-processing

解决方案


@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% 的文件

大多数工作原理都包含在评论中。

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

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

SO 不是代码编写服务,但现在是早上 5 点,我很无聊

否则,由于缺乏规范,我选择检查TP.

您的示例第 5 列为空(两个连续的逗号) 请务必注意这些问题。如果第 5 列并不总是空的,则需要采用不同的方法,因为for/f标记化是针对定界符序列而不是单个定界符执行的。


调试方法:

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

可能性一:

如果您正在使用cygwin,则 cygwin 安装程序优先于findWindows 版本的 *nix 版本。

要调用windows版本,需要指定绝对路径,find.exe通常是C:\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应该报告任何“命中”

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

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


推荐阅读