Board logo

标题: [文本处理] 批处理怎样实现两个文件的字符匹配? [打印本页]

作者: 帝尊    时间: 2023-8-15 11:59     标题: 批处理怎样实现两个文件的字符匹配?

txt文件内可能是XX1匹配,也可能是XX2匹配,也可能都匹配,但是也可能匹配多行。
下面的数据是ini文件的数据。
XX1=XX2=XX3=XX4
XX1=XX2=XX3=XX5
XX1=XX2=XX3=XX6
XX1=XX2=XX3=XX7
AA1=AA2=AA3=AA4
BB1=BB2=BB3=BB4
匹配两个文件相同的字符。
先判定ini文件内的字符与txt文件内的字符有几个相同的。
先判定XX1有几个符合的,有多个符合的就去判定XX2有几个符合的,如果还是有多个符合的那么就给出显示XX3,最好是能有选择。
如果无法给出选择,那么就给个提示提示就是XX3,然后让我自己输入,输入后进行匹配第四个,赋值给变量。
作者: Batcher    时间: 2023-8-15 12:03

回复 1# 帝尊


    请把txt和ini打包上传到网盘,以便测试代码。
作者: 帝尊    时间: 2023-8-15 18:57

回复 2# Batcher



https://www.123pan.com/s/AYXqVv-7L4t.html

谢谢大佬。
作者: pd1    时间: 2023-8-15 19:45

回复 3# 帝尊


    不这个例子最后想得到什么结果呢?我是真没怎么听明白你的描述
作者: czjt1234    时间: 2023-8-15 20:12

没看懂
作者: Batcher    时间: 2023-8-15 21:48

回复 3# 帝尊


    我使用PZ.txt里面的字符串手工去PZ.ini里面搜索,没有匹配的。
作者: 帝尊    时间: 2023-8-15 22:18

回复 5# czjt1234

回复 4# pd1

就是txt文件内有一些数据是在ini文件内可以匹配的,比如txt内有8BTK这个字符串,然后与ini文件进行匹配,匹配成功以后把匹配的那一行=最后的字符串赋值给一个变量。

例如:INI文件内容是这个。
X48=2ABP=MNOP=QRSTUVWXYZ.ABCDEFGH 123 XYZWVUTS
txt文件内容有一行是
X48或者是2ABP。
匹配成功后把QRSTUVWXYZ.ABCDEFGH 123 XYZWVUTS赋值给一个变量

再比如:
F84=6IJK=QRST=VWXYZABCD.VWXYZAB 789 QWERTYUI
F84=8KYP=QRST=VWXYZABCD.VWXYZAB 567 QWERTYUI
F84匹配了两次,但是F84后面有不同的,那么就看txt文件内有哪个可以与6IJK或者8KYP匹配,成功后把对应的最后一组字符赋值给变量
再比如:

例如:INI文件内容是这个。
W70=7UHK=KALI=HIKHIGELHI.HIHGEI HISHEIGE 899 HIGEHKHL
W70=7UHK=KALI=HIKHIGELHI.HIHGEI HISHEIGE 890 HIGEHKHL
W70=7UHK=KALI=HIKHIGELHI.HIHGEI HISHEIGE 456 HIGEHKHL
W70=7UHK=KALI=HIKHIGELHI.HIHGEI HISHEIGE 789 HIGEHKHL
W70=7UHK=KALI=HIKHIGELHI.HIHGEI HISHEIGE 234 HIGEHKHL
只有最后的是不一样的,前面都一样,那么就提示有哪些是一样的。分别是什么。
作者: 帝尊    时间: 2023-8-15 22:19

回复 6# Batcher


    有的,
  1. Date
  2. 78.huhk
  3. Version
  4. F84
  5. VID
  6. 6IJK
  7. BIK
  8. 12345678
复制代码
  1. F84=6IJK=QRST=VWXYZABCD.VWXYZAB 789 QWERTYUI
  2. F84=6IJK=QRST=VWXYZABCD.VWXYZAB 567 QWERTYUI
  3. F84=6IJK=QRST=VWXYZABCD.VWXYZAB 274 QWERTYUI
  4. F84=6IJK=QRST=VWXYZABCD.VWXYZAB 8735 QWERTYUI
  5. F84=6IJK=QRST=VWXYZABCD.VWXYZAB 2576 QWERTYUI
复制代码
F84相同 6IJK也相同。
作者: hfxiang    时间: 2023-8-16 09:40

回复 3# 帝尊
用gawk( http://bcn.bathome.net/tool/5.1.0/gawk.exe )实现如下:
  1. awk "NR==FNR{if(NF){for(i=1;i<=NF;i++)a[++N]=$i}next}{for(i=1;i<=N;i++)if($0~a[i]){print;next}}" pz.txt pz.ini
复制代码

作者: 帝尊    时间: 2023-8-16 10:00

回复 9# hfxiang


    谢谢,可以不适用第三方吗?批处理里面有powershell命令也可以的。
作者: qixiaobin0715    时间: 2023-8-16 10:33

本帖最后由 qixiaobin0715 于 2023-8-16 10:35 编辑

逻辑上还是未表达清楚,比如下面一组内容。txt文件中包含W70、X48、7UHK、9UHK。
1.第1-3行含有W70,而第3行中9UHK与第1、2行中7UHK不同;
2.第4行中7UHK与第1、2行中又相同。
以上情况该如何处理。
这里只是举一个例子而已。
  1. W70=7UHK=KALI=HIKHIGELHI.HIHGEI HISHEIGE 899 HIGEHKHL
  2. W70=7UHK=KALI=HIKHIGELHI.HIHGEI HISHEIGE 890 HIGEHKHL
  3. W70=9UHK=KALI=HIKHIGELHI.HIHGEI HISHEIGE 456 HIGEHKHL
  4. X48=7UHK=KALI=HIKHIGELHI.HIHGEI HISHEIGE 789 HIGEHKHL
复制代码

作者: aloha20200628    时间: 2023-8-16 12:28


给一个纯P方案》先对pz.txt逐行首尾去空格,再用findstr字面量匹配,最后去重...
  1. @echo off
  2. for /f "tokens=*" %%s in (pz.txt) do (
  3. for /f "tokens=4 delims==" %%t in ('findstr /lc:"%%~nxs" pz.ini') do if "%%~t" neq "" if not defined #%%~t (set #%%~t=1 & echo,%%t)
  4. )
  5. pause &exit/b
复制代码

作者: 帝尊    时间: 2023-8-16 23:25

回复 11# qixiaobin0715


    如果是这样的话,也给出提示好了。让我选择用哪一个。
作者: 帝尊    时间: 2023-8-16 23:27

回复 12# aloha20200628


    感谢大佬,明天去试试。
作者: qixiaobin0715    时间: 2023-8-17 09:09

回复 13# 帝尊
看样子你还是没理解我的意思,我只是举个例子而已,主要是说你逻辑上没表达清楚。
顶楼和7楼似乎有矛盾的地方,也可能是我理解能力有限,再举个例子吧(只是举例,这不是重点)。
你在顶楼是这样说的:“先判定XX1有几个符合的,有多个符合的就去判定XX2有几个符合的”。
这里的符合是何意?是说在txt文件中既含有XX1又含有XX2?那么txt中含有xx1而不含xx2如何处理?
所以我的主要意思是,你自己要先把逻辑理清楚。
作者: 帝尊    时间: 2023-8-17 17:51

回复 15# qixiaobin0715


    都有的。不存在没有的情况。
作者: qixiaobin0715    时间: 2023-8-18 08:23

回复 16# 帝尊
引用顶楼的“有多个符合的就去判定XX2有几个符合的。”
好奇怪。既然都有就不需要再去判断是否符合的了。
作者: 帝尊    时间: 2023-8-19 11:44

回复 17# qixiaobin0715
因为有多个符合的,但是XX4的数据不同啊。
作者: qixiaobin0715    时间: 2023-8-20 08:12

本帖最后由 qixiaobin0715 于 2023-8-20 08:30 编辑

可能我理解能力有限,到现在还云里雾里的,还是留待大佬们来解决吧。
作者: 帝尊    时间: 2023-8-22 18:18

回复 19# qixiaobin0715


    12楼的大佬给了代码了。自己完善了下,很好用。
作者: qixiaobin0715    时间: 2023-8-23 09:14

在本论坛混,重要的是要有分享精神和感恩之心。不要光顾自己高兴,难道不想给12楼的点个赞,把自己完善后的代码分享出来吗。




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