batch-file - 用文本替换数字
问题描述
我是编码界的新手,我需要您的帮助来创建批处理或 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
解决方案
@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% 的文件
大多数工作原理都包含在评论中。
请不要链接到场外资源,因为无法保证这些链接对未来的读者仍然有效。
请将真实的原始数据逐字发布到您的问题中,以便可以测试生成的代码,而不会增加为测试目的生成数据的额外问题。
SO 不是代码编写服务,但现在是早上 5 点,我很无聊。
否则,由于缺乏规范,我选择检查TP
.
您的示例第 5 列为空(两个连续的逗号) 请务必注意这些问题。如果第 5 列并不总是空的,则需要采用不同的方法,因为for/f
标记化是针对定界符序列而不是单个定界符执行的。
调试方法:
假设您为每个文件使用一小部分数据进行测试,那么第二个文件中的行号必须与第一个文件中需要更改的行相对应。在发布的数据中,选择了第 300 行、第 333 行等,但示例数据仅包含 6 行,编号为 1-6,因此测试将找不到所需的行并简单地反刍原始文件。
可能性一:
如果您正在使用cygwin
,则 cygwin 安装程序优先于find
Windows 版本的 *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"
. 请描述显示的结果。
推荐阅读
- python - Django collectstatic:是否可以访问 Django 项目之外的静态文件?
- php - 如何保存kartik可编辑yii2
- javascript - 使用 JavaScript 在浏览器控制台中调用 Firefox 的 :screenshot 辅助函数
- java - 如何在while循环中使用switch case将base 10转换为任何base?
- nativescript - 无法通过点击按钮在 android 上播放声音
- mysql - 使用 mysql 从所有数据库中获取所有表
- c++ - 为什么这只有一半回溯?
- python - x86-64 程序集 - 在堆栈上创建一个字符串或为 CreateFile 创建一个寄存器
- python - Python os.system grep 与 bash grep 的结果不同
- kubernetes - 来自 kubernetes 秘密的掌舵值?