找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 19059|回复: 8

[文本处理] 各位老师,请教批处理文本替换的问题

[复制链接]
发表于 2023-9-5 11:52:57 | 显示全部楼层 |阅读模式
原因:由于源数据没处理好,18位的信用码,在电子表格中显示15位,最后三个为000,好在大库bb1.txt中有这完整的码,现在想把带000的换成正确的。

待处理文件aa1.txt

32452346727MA6854h      刘备      领导
bgjyt84jyytur6t000      张民      平民
6587469870654e5330      又鸟      学生
65856987lggu595000      马户      老师

bb1.txt(这个是大库,如果找到就换正确的输出,找不到按原样输出)
bgjyt84jyytur6t789
65856987lggu595809
32452346727MA6854h
...

按aa1.txt的顺序输出cc1.txt
32452346727MA6854h      刘备      领导
bgjyt84jyytur6t789      张民      平民
6587469870654e5330      又鸟      学生
65856987lggu595809      马户      老师
发表于 2023-9-5 14:47:05 | 显示全部楼层
回复 1# gcbgczhang


请参考Q-04和Q-05把bat文件和txt文件都保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA[/url]
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. (for /f "tokens=1*" %%a in ('type "aa1.txt"') do (
  5.     set "StrCol=%%a"
  6.     if "!StrCol:~-3!" equ "000" (
  7.         set "StrPrefix=!StrCol:~0,-3!"
  8.         set "StrFull=X"
  9.         for /f %%i in ('findstr "!StrPrefix!" "bb1.txt"') do (
  10.             set "StrFull=%%i"
  11.         )
  12.         if "!StrFull!" neq "X" (
  13.             echo !StrFull!      %%b
  14.         ) else (
  15.             echo %%a      %%b
  16.         )
  17.     ) else (
  18.         echo %%a      %%b
  19.     )  
  20. ))>"cc1.txt"
复制代码
发表于 2023-9-5 15:13:12 | 显示全部楼层
回复 1# gcbgczhang
把aa1.txt及bb1.txt保存为ANSI编码格式,下载gawk( http://bcn.bathome.net/tool/5.1.0/gawk.exe ),执行如下脚本即可

  1. gawk "NR==FNR{if(length($1)==18)a[substr($0,1,15)]=$1}NR>FNR{A=substr($0,1,15);if(substr($0,16,3)=="000")if(A in a)$0=a[A] substr($0,19,length($0)-18);print}" bb1.txt aa1.txt>cc1.txt
复制代码
发表于 2023-9-5 18:26:23 | 显示全部楼层
  1. powershell -noprofile -executionpolicy bypass "$b=gc bb1.txt;$a=(gc aa1.txt);$a|?{$_ -match '.+000 *.+' -and $b -match [regex]::Matches($_,'(.+)000').groups[1].value}|%%{$a=$a.Replace([regex]::Matches($_,'.+000').value,$b -match [regex]::Matches($_,'(.+)000').groups[1].value)};$a >new_aa1.txt"
复制代码
 楼主| 发表于 2023-9-5 18:39:43 | 显示全部楼层
回复 4# Nsqs


    谢谢老师
 楼主| 发表于 2023-9-5 18:40:00 | 显示全部楼层
回复 3# hfxiang


    谢谢老师
 楼主| 发表于 2023-9-5 18:43:51 | 显示全部楼层
本帖最后由 gcbgczhang 于 2023-9-5 18:54 编辑

谢谢各位老师,
我之前是在a的各行中直接取前15位到b中找到并输出,但有很多重复。各位都师的都比我的先进。但是仅用含有000的行中的前15位去匹配,仍然有重复的。怪我没有说清楚,前15位是有相同的行的,我侥幸心理,以为都15位了不至于有相同的,事实证明确实的,说明无法用批处理,但从老师位的代码中我学习到了新东西,谢谢老师
 楼主| 发表于 2023-9-5 18:46:54 | 显示全部楼层
回复 2# Batcher


    谢谢老师!
 楼主| 发表于 2023-9-5 18:47:07 | 显示全部楼层
回复 4# Nsqs


        谢谢老师!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 14:12 , Processed in 0.020447 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表