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

[文件操作] [已解决]批处理如何提取Unicode编码文件中的字符串

Unicode 格式文件如下:

aaa.inf(韩文字符)

INTL_GEO_NATION="134"
50_GRAY="50% 회색"
ASTERISK="일반 메시지"
BOXES="네모"
BRICK="벽돌색"
CLOSE_PROGRAM="프로그램 닫기"
CRITICAL_BATTERY_ALARM="배터리 위험 수준 경보"
CRITICAL_STOP="시스템 오류"
CRITTERS="V자"
DEFAULT_BEEP="기본 경고음"
DEFAULT_SOUND="기본 경고음"
DESERT="황토색"
DEVICE_CONNECT="장치 연결"
DEVICE_DISCONNECT="장치 연결 해제"
DEVICE_FAIL="장치 연결 오류"
DIAMONDS="마름모"
EGGPLANT="가지색"
EMPTY_RECYCLE_BIN="휴지통 비우기"
EVENT_VIEWER="이벤트 뷰어"
EXCLAMATION="경고 메시지"
EXIT_WINDOWS_NT="Windows 종료"
GAMES="게임"

我的需求是:如何从aaa.inf 中提取某行(不是全部)等号后面的字符串(不是全部),比如 DIAMONDS="마름모" 中的 “마름모”(不要引号),输出到一个变量,或一个新的Unicode文件中。
谢谢大师们出手相助!


附件(源文件):
76626yyn

回复 1# yuanyannian
  1. @echo off
  2. for /f "tokens=2 delims==" %%i in ('find /i "DIAMONDS=" ^<au.txt') do set "str=%%~i"
  3. echo,%str%
  4. pause
复制代码

TOP

回复 2# terse


    谢谢,不过好像不行,运行后显示:
76626yyn

TOP

回复 3# yuanyannian


    把你的inf文件压缩之后上传到顶楼我试试

TOP

本帖最后由 yuanyannian 于 2014-7-26 22:24 编辑

回复 4# DAIC


    源文件已经上传到顶楼(附件),其实这是 Windows 安装源盘中注册表源文件,因为所涵盖所有国家的语言,所以是变量,不同的语言,等号后面的内容不一样的,但都是 unicode 编码字符。
76626yyn

TOP

这个问题似乎有点难,既要正确的原样查找 Unicode 格式文件中的字符串(通常用 for /f %%i in () 到的已经是乱码了),又要写入到一个 Unicode 格式文件中。
个人观点:就目前的方法,采用普通的的文本,如 .txt、 .ini、 .bat好像都无法处理 Unicode 格式,那么我想,新写入的文件格式只能是注册表文件(.reg---保存为 unicode 格式应该可以运行),将变量以 .reg 的形式保存,用bat批处理导入这个 .reg 文件(反正我最终要的结果是注册表)。
76626yyn

TOP

问题是:如何原样提取 Unicode 格式文件中的字符串,并且又原样写入到一个 Unicode 格式文件中。
我想肯定是有办法的,只是我不懂罢了,所以请老师们出手,谢谢了!!!
76626yyn

TOP

本帖最后由 CrLf 于 2014-7-27 20:01 编辑

GB2312 编码是不支持韩文的,强行从 unicode 转为 扩展ASCII码 极易会丢失字符
949 代码页不知道为什么又没法用,1201 无效果,65001 在 xp 下又有问题
---------------------------------------------------------------------------------
powershell 默认输出就是 unicode:
  1. ((select-string "DIAMONDS=" a.inf).line -split '"')[1]>b.inf
复制代码
perl 也可实现,非系统自带:
  1. use Encode;
  2. open(IN,"<:encoding(utf-16)","a.inf");
  3. open(OUT,">b.inf");
  4. binmode(OUT, ":encoding(utf-16)");
  5. while(<IN>){
  6. print OUT ((split /"/)[1]) if /^DIAMONDS=/;
  7. }
复制代码
再来个 python...
  1. import codecs
  2. import re
  3. text =open('a.inf', encoding='utf-16').read()
  4. text=re.sub(r'[\s\S]*DIAMONDS="(.*)"[\s\S]*','\g<1>',text)
  5. open('b.inf', 'w', encoding='utf-16').write(text)
复制代码

TOP

回复 8# CrLf

恕我p盲,这几个如何使用?
76626yyn

TOP

回复 8# CrLf

powershell 运行后是一个空的 b.inf
76626yyn

TOP

回复 10# yuanyannian


    什么操作系统?PowerShell的版本是?

TOP

vbs 应该也可以
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. txt = fso.OpenTextFile("HIVEDEF.INF", 1, flase, -1).ReadAll
  3. Set re = New RegExp
  4. re.Pattern = "^DIAMONDS=""(.*)"""
  5. re.IgnoreCase = true
  6. re.Global = true
  7. re.MultiLine = true
  8. For Each m in re.Execute(txt)
  9.     s = s & m.SubMatches(0) & vbCrLf
  10. Next
  11. fso.OpenTextFile("New_HIVEDEF.INF", 2, true, -1).Write s
复制代码

TOP

回复 11# DAIC


    我的操作系统是 Windows 7 x64,powershell 我看了好像是 v1.0
76626yyn

TOP

回复 13# yuanyannian


Win7的PowerShell版本应该是2.0吧
C:\>powershell -c "Get-Host | Select-Object Version"

Version
-------
2.0

TOP

回复 14# DAIC

是的,用你给的方法查看为 2.0
76626yyn

TOP

返回列表