Board logo

标题: [文本处理] [已解决]批处理BAT如何根据a文本中的字段在b文本中查询,符合条件的输出c文本? [打印本页]

作者: maillard    时间: 2014-3-28 17:42     标题: [已解决]批处理BAT如何根据a文本中的字段在b文本中查询,符合条件的输出c文本?

本帖最后由 maillard 于 2014-3-29 09:33 编辑

1、文本a.txt里面有序号和单词
01、bathtub
02、ornament
03、chimney
04、respiratory
05、shoplift
..................

2、词典b.txt里面有对应的单词和中文释义
abandon        vt.放弃,遗弃;n.放任,狂热
abandoned        adj.被抛弃的,自甘堕落的,没有约束的,放荡的
abandonee        n.被遗弃者,被委付者
abandoner        n.遗弃者,委付者
abandonment        n.放弃
......

3、如何实现将a.txt中的单词在b.txt中查询中文释义,并按原序号顺序生成如下c.txt:
01、bathtub        n.浴缸,澡盆
02、ornament         n.装饰物,教堂用品vt.装饰,修饰
03、chimney        n.烟囱,灯罩
04、respiratory        adj.呼吸的
作者: 522235677    时间: 2014-3-28 18:00

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=2 delims=、" %%a in (a.txt) do (
  3. for /f "delims=" %%i in ('findstr /c:"%%a#" b.txt') do set /a n+=1&echo !n!、%%i
  4. )
  5. pause
复制代码
你那个b.txt 单词和词意之间是空格还是tab符号?
如果是空格的话你就把代码中#替换为空格
如果是tab则替换tab
作者: maillard    时间: 2014-3-28 20:23

回复 2# 522235677


    非常感谢522235677,代码可以运行,但是有两个问题

1、原文本a.txt里面有序号中的序号不完全是按个位数顺序排列的
01、bathtub
02、ornament
03、chimney
04、respiratory
05、shoplift
06、xxxx
06.1、xxxxx     -------有些地方有小数点
06.2、xxxxx
09、xxxxx       -------有些地方会漏一两个编号

希望输出的结果是完全按原a.txt的编号


2、查询结果是模糊匹配,比如查询sexual,出来下面很多结果,希望输出是精确匹配的结果。

asexual        adj.无性的,无性生殖的
bisexual        adj.两性的,雌雄同体的,[生物]=性体,[精神病]在性欲上受两性吸引的人
heterosexual        adj.异性的,异性爱的n.异性恋的人
homosexual        adj.同性恋的n.同性恋
intersexual        adj.两性间的
.......
作者: 522235677    时间: 2014-3-28 20:49

回复 3# maillard
  1.     @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=、" %%a in (a.txt) do (
  3.         for /f "delims=" %%c in ('findstr /c:"%%b " b.txt') do echo %%a、%%c
  4. )
  5. pause
复制代码
让你替换那个#就是为了全字匹配。我自己测试都没有问题的
作者: maillard    时间: 2014-3-28 21:01

本帖最后由 maillard 于 2014-3-28 21:17 编辑

回复 4# 522235677


    #号已经替换了为tab了

出来很多模糊查询的结果
02.4、amorous        adj.多情的,恋爱的,表示爱情的
02.4、clamorous        adj.大喊大叫的
02.4、glamorous        adj.富有魅力的,迷人的
02.4、unglamorous        adj.没有魅力的,无浪漫色彩的,乏味的,单调的
.......

04、coral        n.珊瑚,珊瑚虫
04、corporal        n.<美>下士adj.肉体的,身体的
04、discifloral        adj.[植](有)盘状花的
04、doctoral        adj.博士的
04、electoral        adj.选举人的,选举的
.........
作者: 522235677    时间: 2014-3-28 21:15

回复 5# maillard


    我空格 & tab 都测试ok。
作者: 522235677    时间: 2014-3-28 21:16

加群 群名称是批处理之家① 43011867
作者: 522235677    时间: 2014-3-28 22:04

findstr "^%%b " b.txt
findstr对tab符号不起作用,坐等高手
作者: apang    时间: 2014-3-28 22:28

回复 8# 522235677

findstr /i "\<%%b\>" b.txt
\< 和 \>相当于vbs中的\b,匹配字符(单词)边界
作者: apang    时间: 2014-3-28 22:55

本帖最后由 apang 于 2014-3-28 23:27 编辑
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. txt = fso.OpenTextFile("b.txt").ReadAll
  3. Set f = fso.OpenTextFile("a.txt")
  4. while Not f.AtEndOfStream
  5.     strline = Trim(f.ReadLine)
  6.     If InStr(strLine, "、") Then
  7.         ar = Split(strLine, "、")
  8.         s = s & ar(0) & "、" & RegEx(ar(1)) & vbCrLf
  9.     End If
  10. wend
  11. fso.OpenTextFile("c.txt", 2, true).Write s
  12. Function RegEx(str)
  13.     Set re = New RegExp
  14.     re.Pattern = "\b" & str & "\b[^\r]*"
  15.     re.IgnoreCase = true
  16.     If re.Test(txt) Then
  17.         RegEx = re.Execute(txt)(0)
  18.     Else RegEx = str
  19.     End If
  20. End Function
复制代码

作者: maillard    时间: 2014-3-29 09:32

@echo off & setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=、" %%a in (a.txt) do (
        for /f "delims=" %%c in ('findstr /B  "\<%%b\>" b.txt') do echo %%a、%%c
)>>c.txt
pause

用4楼的代码修改一下测试成功了,10楼的代码暂时还没能看懂,继续学习~~,谢谢各位!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2