我是编码世界的新手,我需要你的帮助来创建一个批处理或VB脚本来用静态文本替换数字; 我收到以下文件
我需要更换" TP"和" 123456678"使用静态文本" LL"," ONRECORD"在比较第二个文件
之后行号。有人已经完成了这个要求吗?
我没有任何代码,因为我是一只新蜜蜂,在这里学习。
谢谢。
> 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
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了名为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.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
行。它保持窗口打开,以便可以看到报告。
[201805170055]我在第二个pause
循环中添加了一个新行ECHO "%%a" "%%b"
,以显示感兴趣的列的内容。这应该显示像for /f
这样的行列表。请描述显示的结果。