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

[文本处理] 【已解决】批处理匹配文件1第1列将文件2第2列覆盖文件1第2列

[复制链接]
发表于 2025-9-1 08:58:42 | 显示全部楼层
回复 30# chishingchan

原以为行末尾的空白字符应被删除,没想到却是必须的
订正代码如下,再试试吧...

  1. @echo off &setlocal enabledelayedexpansion &chcp 65001>nul
  2. for /f "tokens=2 delims= " %%v in ('chcp') do if "%%v"=="936" (set "c=default") else set "c=utf8"
  3. powershell "gc 1.txt|%%{$a=$_.split('        ');if($a[1] -eq ''){$a[0]+'        '}}">#.$
  4. (for /f "tokens=1,2* delims=        " %%a in (1.txt) do (
  5.    set/a "n+=1" &set "v2=" &set "_v2=" &set/p "v2="
  6.    if !n! equ 3 (echo,65001        %%a        %%b) else (
  7.       for /l %%n in (1,1,5) do if not defined _v2 for /f "tokens=1-2 delims=        " %%x in ("!v2!") do if /i "%%a"=="%%x" (set "_v2=%%y") else (set/p "v2=")
  8.       if not defined v2 (echo,%%a        %%b        %%c) else (echo,%%a        !_v2!        %%c) )
  9. ))<2.txt >3.txt
  10. for %%v in (#.$) do if %%~zv gtr 0 powershell "$l=[io.file]::readalltext('3.txt',[text.encoding]::!c!).trim();gc '#.$'|%%{$v=$_.replace('        ','                ');$l=$l.replace($_,$v);};[io.file]::writeAlltext('3.txt',$l,[text.encoding]::!c!)"
  11. del /q "#.$" &pause&exit/b
复制代码
发表于 2025-9-1 09:52:36 | 显示全部楼层
其实这个问题挺简单的,从2.txt 找出与1.txt 第一列相同的行并替换1.txt的行,就是批处理处理存在变量总大小限制,不过到现在也没有看到楼主说的不超过5位数的文件...行数大小决定了是否可用批处理解决及代码方法。
楼主用几千行的文件测试过吗?如果一直用几十行的文本测试,没有考虑到效率问题,后面可能还需要再反复修改或者重写代码...


用ai写了个powershell代码,不了解其代码是否存在瑕疵、错误,但是测试几个样本均 结果正确,效率高。
文本均保存为ansi编码。代码保存为 test.ps1。


  1. # 输入输出文件
  2. $text1 = "text1.txt"
  3. $text2 = "text2.txt"
  4. $text3 = "text3.txt"

  5. # 建立哈希表:第一列 -> 整行
  6. $map = @{}
  7. Get-Content $text2 | ForEach-Object {
  8.     $cols = $_ -split "`t", 2
  9.     if ($cols.Count -ge 1) {
  10.         $map[$cols[0]] = $_
  11.     }
  12. }

  13. # 遍历文本1,按行号处理
  14. Get-Content $text1 | ForEach-Object -Begin { $lineNo = 0 } -Process {
  15.     $lineNo++
  16.     if ($lineNo -le 2) {
  17.         # 第1、2行保持不变
  18.         $_
  19.     }
  20.     elseif ($lineNo -eq 3) {
  21.         # 第3行前插入 65001 + 制表符
  22.         "65001`t$_"
  23.     }
  24.     else {
  25.         # 第4行及以后,按第一列匹配替换
  26.         $cols = $_ -split "`t", 2
  27.         $key = $cols[0]
  28.         if ($map.ContainsKey($key)) {
  29.             $map[$key]
  30.         } else {
  31.             $_
  32.         }
  33.     }
  34. } | Out-File $text3 -Encoding Default
复制代码

评分

参与人数 1技术 +1 收起 理由
chishingchan + 1 谢谢!

查看全部评分

 楼主| 发表于 2025-9-1 10:37:52 | 显示全部楼层
回复 31# aloha20200628


报告老大,这一行结尾多了一个 [TAB]
  1. MigrateFeatureStates                Application: [1]       
复制代码
 楼主| 发表于 2025-9-1 10:47:17 | 显示全部楼层
回复 32# 77七


    脚本返回结果:(窗口一闪而没)
  1. 无法加载文件 1A2U.ps1,因为在此系统中禁止执行脚本。
  2. 有关详细信息,请参阅 "get-help about_signing"。
  3.     + CategoryInfo        : NotSpecified: (:) [], ParentContainsErrorRecordException
  4.     + FullyQualifiedErrorId : RuntimeException
复制代码
我的系统及版本类型请看 20#,谢谢!
发表于 2025-9-1 11:04:26 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-1 12:35 编辑

回复 33# chishingchan

重新调整了算法,省去了 powershell 助力 》再试试如下这个新版本,应该是到家了(经比较 2.txt 和 3.txt 二者完全一致 )...

  1. @echo off &setlocal enabledelayedexpansion &chcp 65001>nul
  2. (for /f "delims=" %%s in (1.txt) do for /f "tokens=1,2 delims=        " %%a in ("%%s") do (
  3.    set "v=%%s" &set/a "n+=1" &set "v2=" &set "_v2=" &set/p "v2="
  4.    if !n! equ 3 (echo,65001        %%s) else (
  5.       for /l %%n in (1,1,5) do if not defined _v2 for /f "tokens=1,2 delims=        " %%x in ("!v2!") do if /i "%%a"=="%%x" (set "_v2=%%y") else (set/p "v2=")
  6.       if defined _v2 (for %%r in ("!_v2!") do echo,!v:%%b=%%~r!) else (echo,%%s) )
  7. ))<2.txt >3.txt
  8. pause&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
chishingchan + 1 谢谢!应该可以了。

查看全部评分

发表于 2025-9-1 11:14:46 | 显示全部楼层
回复 34# chishingchan


   PowerShell初学者FAQ
参考设置下
 楼主| 发表于 2025-9-1 11:56:14 | 显示全部楼层
回复 35# aloha20200628


    请问老大,此批处理对于 ActionText.idt 表算是完美了。但我想用此批处理通用在其它的表文件上。即:如果表的列数4列以上,翻译的列在第3列,应修改哪些参数?谢谢!
 楼主| 发表于 2025-9-1 12:01:35 | 显示全部楼层
回复 32# 77七


    一般除了 File 表,其他表的行数没那么多!Component 表的行数虽然跟 File 表差不多,但是不需要翻译处理。Control 表需要翻译的话也只有 300 行左右。
 楼主| 发表于 2025-9-1 12:05:06 | 显示全部楼层
msi 文件的字符串基本是大同小异或一致的,所以才想到以此方法辅助翻译,使一次翻译能通用其它软件中
发表于 2025-9-1 12:31:59 | 显示全部楼层
回复 37# chishingchan

先试试以下代码,用于第3列替换...

  1. @echo off &setlocal enabledelayedexpansion &chcp 65001>nul
  2. (for /f "delims=" %%s in (1.txt) do for /f "tokens=1,3 delims=        " %%a in ("%%s") do (
  3.    set "v=%%s" &set/a "n+=1" &set "v2=" &set "_v2=" &set/p "v2="
  4.    if !n! equ 3 (echo,65001        %%s) else (
  5.       for /l %%n in (1,1,5) do if not defined _v2 for /f "tokens=1,3 delims=        " %%x in ("!v2!") do if /i "%%a"=="%%x" (set "_v2=%%y") else (set/p "v2=")
  6.       if defined _v2 (for %%r in ("!_v2!") do echo,!v:%%b=%%~r!) else (echo,%%s) )
  7. ))<2.txt >3.txt
  8. pause&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
chishingchan + 1 谢谢!

查看全部评分

 楼主| 发表于 2025-9-1 13:05:12 | 显示全部楼层
回复 40# aloha20200628


    谢谢!能用。经对比,修改 tokens= 的值。
发表于 2025-9-1 14:00:46 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-1 14:02 编辑

回复 41# chishingchan

ok

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:05 , Processed in 0.031575 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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