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

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

[复制链接]
发表于 2025-8-29 17:48:27 | 显示全部楼层 |阅读模式
注:我是个汉化爱好者,为了加快汉化进程,更需要脚本的帮助。

.msi 安装包导出 .idt 表后需要进行汉化后再导入。不同程序的 .idt 表区别甚少,但肯定不相同:
例如:ActionText.idt (以下以少量行为例)

文件1 的内容为:
  1. Action        Description        Template
  2. s72        L0        L0
  3. ActionText        Action
  4. Advertise        Advertising application       
  5. AllocateRegistrySpace        Allocating registry space        Free space: [1]
  6. AppSearch        Searching for installed applications        Property: [1], Signature: [2]
  7. BindImage        Binding executables        File: [1]
  8. CCPSearch        Unregistering modules       
  9. CostFinalize        Computing space requirements       
  10. CostInitialize        Computing space requirements       
  11. CreateFolders        Creating folders        Folder: [1]
  12. CreateShortcuts        Creating shortcuts        Shortcut: [1]
  13. DeleteServices        Deleting services        Service: [1]
  14. DuplicateFiles        Creating duplicate files        File: [1],  Directory: [9],  Size: [6]
  15. FileCost        Computing space requirements       
  16. FindRelatedProducts        Searching for related applications        Found application: [1]
复制代码
文件2 的内容为:
  1. Action        Description        Template
  2. s72        L0        L0
  3. 65001        ActionText        Action
  4. Advertise        正在广告应用程序       
  5. Advertise.0D75A8F9_7D69_45B2_8FCA_D8FCA48808A3        正在广告应用程序       
  6. Advertise.C6D44AB7_708D_4634_B15C_259C7FCECB17        正在广告应用程序       
  7. AllocateRegistrySpace        正在分配注册表空间        Free space: [1]
  8. AppSearch        正在搜索已安装的应用程序        Property: [1], Signature: [2]
  9. BindImage        正在绑定可执行文件        File: [1]
  10. CCPSearch        正在搜索符合条件的产品       
  11. CostFinalize        正在计算空间要求       
  12. CostInitialize        正在计算空间要求       
  13. CreateFolders        正在创建文件夹        Folder: [1]
  14. CreateShortcuts        正在创建快捷方式        Shortcut: [1]
  15. DeleteServices        正在删除服务        Service: [1]
  16. DuplicateFiles        正在创建重复文件        File: [1],  Directory: [9],  Size: [6]
复制代码
匹配 文件1 的第1列获取 文件2 的第2列内容回写到 文件1 中,生成 文件3。
文件3 的内容应该为:
  1. Action        Description        Template
  2. s72        L0        L0
  3. 65001        ActionText        Action
  4. Advertise        正在广告应用程序       
  5. AllocateRegistrySpace        正在分配注册表空间        Free space: [1]
  6. AppSearch        正在搜索已安装的应用程序        Property: [1], Signature: [2]
  7. BindImage        正在绑定可执行文件        File: [1]
  8. CCPSearch        正在搜索符合条件的产品       
  9. CostFinalize        正在计算空间要求       
  10. CostInitialize        正在计算空间要求       
  11. CreateFolders        正在创建文件夹        Folder: [1]
  12. CreateShortcuts        正在创建快捷方式        Shortcut: [1]
  13. DeleteServices        正在删除服务        Service: [1]
  14. DuplicateFiles        正在创建重复文件        File: [1],  Directory: [9],  Size: [6]
  15. FileCost        Computing space requirements       
  16. FindRelatedProducts        Searching for related applications        Found application: [1]
复制代码
由于汉化需要 UTF-8 编码,所以汉化的同时需要修改文件3的第3行的第1列是 65001,求批处理,谢谢!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2025-8-29 19:00:07 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-8-29 19:01 编辑

回复 1# chishingchan

以下代码读取 2.txt 每行第2列数据,去替换 1.txt 每行第2列,生成 3.txt,假设各列分隔符是跳格,并对 3.txt 第3行增添前缀 65001 ...

  1. @echo off &setlocal enabledelayedexpansion
  2. (for /f "tokens=1,2* delims=        " %%a in (1.txt) do (
  3.     set/a "n+=1" &set/p "v2="
  4.     for /f "tokens=2 delims=        " %%x in ("!v2!") do if !n! equ 3 (echo,65001        %%a        %%x        %%c) else echo,%%a        %%x        %%c) )<2.txt >3.txt
  5. pause&exit/b
复制代码

评分

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

查看全部评分

 楼主| 发表于 2025-8-29 20:29:11 | 显示全部楼层
回复 2# aloha20200628


    老大,测试结果:当 1.txt 和 2.txt 的编码都是 ASCII,结果正常。
当 2.txt 的编码是 UTF-8,生成的 3.txt 的编码也是 UTF-8,还有办法吗?
发表于 2025-8-29 21:06:43 | 显示全部楼层
2.txt 都是 UTF-8 吗?
或者部分 ANSI 部分 UTF-8 要自己判断?

UTF-8 有 BOM 吗?
或者部分有 BOM 部分没 BOM 要自己判断?

2.txt 的文件大小一般多少?小于 10K?
发表于 2025-8-29 21:22:49 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-8-29 21:37 编辑

回复 3# chishingchan

只须先将 1.txt 转为utf-8编码文件即可,用以下批处代码可完成转换,其结果文件为 1_u8.txt。代码假设 1.txt 每行字符量不超过8K,其总行数预设不超过9999行...

  1. @echo off &setlocal enabledelayedexpansion &chcp 936>nul
  2. for /f "delims=" %%a in (1.txt) do set/a "n+=1" &set "v=00000!n!" &set "_#!v:~-4!=%%a"
  3. chcp 65001>nul
  4. (for /f "tokens=1* delims==" %%a in ('set _#') do echo,%%b)>1_u8.txt
  5. pause&exit/b
复制代码
如果系统已安装 powershell 亦可用以下批处代码完成 1.txt 》1_u8.txt 的编码转换,不再限制每行字符量和不必预设总行数最大值...

  1. @echo off &powershell "gc 1.txt|sc 1_u8.txt -enc utf8" &pause&exit/b
复制代码
以下代码采用65001码页(即utf-8编码)处理 1_u8.txt(即1.txt的 utf-8 编码文件)和 2.txt(已是utf-8编码)并生成 utf-8 编码的 3.txt

  1. @echo off &setlocal enabledelayedexpansion &chcp 65001>nul
  2. (for /f "tokens=1,2* delims=        " %%a in (1_u8.txt) do (
  3.    set/a "n+=1" &set/p "v2="
  4.    for /f "tokens=2 delims=        " %%x in ("!v2!") do if !n! equ 3 (echo,65001        %%a        %%x        %%c) else echo,%%a        %%x        %%c) )<2.txt >3.txt
  5. pause&exit/b
复制代码

评分

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

查看全部评分

 楼主| 发表于 2025-8-29 22:33:01 | 显示全部楼层
回复 5# aloha20200628


    1.txt 一般是英文软件直接导出,绝大多数是 ANSI 编码。如果需要转换 1~2 文件的编码那就算了,利用之前的脚本将 2.txt 转换为 ANSI 编码即可。
发表于 2025-8-29 23:44:50 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-8-30 00:08 编辑

回复 6# chishingchan

如果 1.txt 真是不含多字节如中文字符的ansi编码,而 2.txt 是utf-8编码,则采用5楼第二段代码并将其中的 1_u8.txt 改为 1.txt 即可...
 楼主| 发表于 2025-8-30 10:24:28 | 显示全部楼层
本帖最后由 chishingchan 于 2025-8-30 10:28 编辑

回复 2# aloha20200628


    老大,不好意思,又要麻烦你了!这个批处理有点不对劲,2.txt 没有针对 1.txt 第1列的匹配字段而生成的结果,汉化内容是错误的:
3.txt  (1.txt, 2.txt 均是 ANSI 编码,第3行也是错的。)
  1. Action        Description        Template
  2. s72        L0        L0
  3. 65001        ActionText        ActionText       
  4. Advertise        正在广告应用程序       
  5. AllocateRegistrySpace        正在广告应用程序        Free space: [1]
  6. AppSearch        正在广告应用程序        Property: [1], Signature: [2]
  7. BindImage        正在分配注册表空间        File: [1]
  8. CCPSearch        正在搜索已安装的应用程序       
  9. CostFinalize        正在绑定可执行文件       
  10. CostInitialize        正在搜索符合条件的产品       
  11. CreateFolders        正在计算空间要求        Folder: [1]
  12. CreateShortcuts        正在计算空间要求        Shortcut: [1]
  13. DeleteServices        正在创建文件夹        Service: [1]
  14. DuplicateFiles        正在创建快捷方式        File: [1],  Directory: [9],  Size: [6]
  15. FileCost        正在删除服务       
  16. FindRelatedProducts        正在创建重复文件        Found application: [1]
复制代码
现时用的是 2# 的代码,麻烦老大修正一下,谢谢!
 楼主| 发表于 2025-8-30 10:33:22 | 显示全部楼层
本帖最后由 chishingchan 于 2025-8-30 10:37 编辑

回复 5# aloha20200628


    使用 5# 第二段批处理,编码正确,但是第 3 行及翻译的内容是错误的。
可能是之前2楼的代码是可以的,但是修改后我也没留底了。

应用后发现结果文件(3.txt)某行的两个跳表键变成一个。等老大的修正代码后再应用测试,谢谢!
发表于 2025-8-30 12:51:47 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-8-30 12:54 编辑

回复 9# chishingchan

代码订正如下,其中假设 2.txt 是简中编码(gb2312)文件 ...

  1. @echo off &setlocal enabledelayedexpansion
  2. (for /f "tokens=1,2* delims=        " %%a in (1.txt) do (
  3.    set/a "n+=1" &set "v2=" &set "_v2=" &set/p "v2="
  4.    if !n! equ 3 (echo,65001        %%a        %%b        %%c) 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 not defined v2 (echo,%%a        %%b        %%c) else (echo,%%a        !_v2!        %%c) )
  7. ))<2.txt >3.txt
  8. pause&exit/b
复制代码
如果 1.txt 是纯 ansi 字符集编码文件,2.txt 是 utf-8 编码文件,则须在以上代码第一行末尾追加 &chcp 65001>nul 即可...

评分

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

查看全部评分

 楼主| 发表于 2025-8-30 13:19:51 | 显示全部楼层
回复 10# aloha20200628


    应用上有一行不对,此两个字段原有两个 TAB 键分隔(不用翻译字符串的行),结果只有一个分隔。老大,这个能修正吗?非常谢谢!
  1. MigrateFeatureStates                Application: [1]
复制代码
发表于 2025-8-30 14:27:38 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-8-30 15:28 编辑

回复 11# chishingchan

是指某行第一和第二字段用两个跳格分割?
若是,可说明该行与其他行有何唯一区别点?若有则很容易拿下
若无,那么在众多文本行中为其要逐行探测有无这两个跳格,其代码开销和效率代价是不是过大了,还不如手工修理一下...
发表于 2025-8-30 18:23:24 | 显示全部楼层
有多少行是关键?行数少好解决;行数多需满足一定条件才可以用bat解决,否则得用其它脚本。
 楼主| 发表于 2025-8-30 19:38:18 | 显示全部楼层
回复 13# 77七


    行数不超过 4 位数字
发表于 2025-8-30 21:13:15 | 显示全部楼层
  1. @echo off
  2. cd /d "%~dp0"
  3. set input_1=1.txt
  4. set input_2=2.txt
  5. set output=out.txt

  6. >"%output%" cd.
  7. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^< "%input_1%"') do (
  8.         if %%a leq 2 (
  9.                 >> "%output%" echo %%b
  10.         ) else if %%a equ 3 (
  11.                 >> "%output%" echo 65001        %%b
  12.         ) else (
  13.                 for /f "delims=        " %%c in ("%%b") do (
  14.                         echo %%c       
  15.                 )
  16.         )
  17. )) > "%temp%\$1"
  18. (for /f "useback skip=3 delims=" %%a in ("%input_1%") do (
  19.         echo %%a
  20. )) > "%temp%\$2"
  21. findstr /rbg:"%temp%\$1" "%input_2%" >> "%temp%\$3"
  22. (for /f "useback delims=        " %%a in ("%temp%\$3") do (
  23.         echo %%a
  24. )) > "%temp%\$4"
  25. findstr /rbvg:"%temp%\$4" "%temp%\$2" >> "%temp%\$3"
  26. sort "%temp%\$3" >> "%output%"

  27. del "%temp%\$?"
  28. pause
复制代码

试试看吧,希望你的样本具有代表性,希望findstr /g不会出错。

评分

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

查看全部评分

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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