标题: [文本处理] 【已解决】批处理比对两个文本文件的问题 [打印本页]
作者: thp2008 时间: 2023-6-20 22:50 标题: 【已解决】批处理比对两个文本文件的问题
本帖最后由 thp2008 于 2023-6-21 11:14 编辑
比如,我有两个文本文件,yuanshi.txt new.txt
yuanshi.txt 是比较全的里面都是汉字名称,没有其它字符。
想将new.txt里的所有行跟yuanshi.txt里的所有行进行比较,删除掉new.txt里面,在yuanshi.txt里已存的行,
最终输出的结果,new.txt里只保留yuanshi.txt里不存在的行。或者将new.txt里在yuanshi.txt中这些不存在的行,单独输出到另一个文件也行。
示例:
yuanshi.txt
波尔多
勃艮第
香槟区
罗纳河谷
卢瓦尔河谷
阿尔萨斯
西南产区
朗格多克鲁西荣
威尼托
安布里亚
阿布鲁佐
皮尔蒙特
坎帕尼亚
维罗纳
new.txt
卢瓦尔河谷
普罗旺斯科西嘉
阿尔萨斯
西南产区
朗格多克鲁西荣
托斯卡纳
西西里岛
威尼托
比对后,输出结果:
普罗旺斯科西嘉
托斯卡纳
西西里岛
另外,我还发现了一个问题。
本来我想把TXT全部保存为ANSI来操作的,但我发现,有少量汉字,不能保存为ANSI,否则显示为??
比如:䴙、䴘、类似这种汉字,就不行,但保存为UTF-8就不会乱码,问题又来了,保存为UTF-8,命令行下,就显示乱码。
只要能完成,比较这两个文本文件的行就行,不管用什么方式,第三方工具也行,我需要的是结果。
这两个问题,该如何处理。感谢大家。
作者: 77七 时间: 2023-6-21 00:30
本帖最后由 77七 于 2023-6-21 11:13 编辑
- @echo off
- chcp 65001
- for /f "usebackq delims=" %%a in ("yuanshi.txt") do (
- set _"%%a"=1
- )
- (for /f "usebackq delims=" %%a in ("new.txt") do (
- if not defined _"%%a" (
- echo %%a
- set /a n+=1
- )
- ))>new.xxx
- move /y new.xxx new.txt
- echo %n%
- pause
复制代码
文本行较少,可以使用批处理。
把文本和批处理都保存为utf-8编码格式
使用前先备份
作者: hfxiang 时间: 2023-6-21 10:58
回复 1# thp2008
将“yuanshi.txt” 及 “new.txt” 以ANSI编码保存,下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe ),执行如下指令后“out.txt”即为你所需要的结果:- gawk "NR==FNR{a[$0]++;next}!a[$0]++" yuanshi.txt new.txt>out.txt
复制代码
注:只能保存为UTF-8编码的汉字可用RUBY( https://github.com/oneclick/ruby ... kit-3.2.2-1-x64.exe )中所带的gawk处置
作者: thp2008 时间: 2023-6-21 11:01
本帖最后由 thp2008 于 2023-6-21 11:39 编辑
回复 2# 77七
感谢,非常好用,两个要求都满足了。高手。
另外,我想问下,我想将输出的New.txt,统计所有有文字的行数,该如何统计,谢谢!
作者: thp2008 时间: 2023-6-21 11:04
回复 3# hfxiang
感谢你的帮助,我试了一下,这个方法也可以,但是就是保存为ANSI,会产生少量特别的汉字,乱码的问题不行。
第二个工具可以。
作者: 77七 时间: 2023-6-21 11:14
回复 4# thp2008
已在2楼代码上修改。
作者: thp2008 时间: 2023-6-21 11:15
回复 thp2008
已在2楼代码上修改。
77七 发表于 2023-6-21 11:14
非常感谢
作者: buyiyang 时间: 2023-6-21 11:20
本帖最后由 buyiyang 于 2023-6-21 14:15 编辑
受http://www.bathome.net/viewthread.php?tid=43845启发,用比较二进制的方法写了一个- @echo off
- call :diff "yuanshi.txt" "new.txt"
- pause&exit
- :diff
- echo,>>%1&echo,>>%2
- for %%i in (%1 %2) do (
- fsutil file creATenew "new_%%~i" %%~zi >nul
- (for /f "tokens=2" %%a in ('fc /b %%i "new_%%~i" ^| findstr /irc:"[0-9A-F]*: [0-9A-F][0-9A-F] 00"') do (
- set /p=%%a
- if /i "%%a"=="0A" echo,
- ))<nul >"new-%%~i"
- del "new_%%~i"
- )
- findstr /ivxg:"new-%~1" "new-%~2" >result.txt
- del "new-%~1" "new-%~2"
- certutil -decodehex -f result.txt result.txt
复制代码
作者: thp2008 时间: 2023-6-21 11:35
本帖最后由 thp2008 于 2023-6-21 11:37 编辑
回复 8# buyiyang
我测试了,可以,没有问题。
输出结果在result.txt中,完全正确。
作者: aloha20200628 时间: 2023-6-21 16:49
借一楼题目可以复习纯P的两个快捷句式
一。比对两个文本文件
findstr /rv /g:"yuanshi.txt" "new.txt">"new.new"
其中参数 /r 对于提高中文字符匹配率很关键
二。获取文本文件行数
for /f "delims=" %%n in ('find /v /c "" ^<new.new') do (echo,Lines=%%n)
作者: thp2008 时间: 2023-6-22 11:25
本帖最后由 thp2008 于 2023-6-22 11:29 编辑
回复 10# aloha20200628
学习中,感谢分享!
但是我使用
findstr /rv /g:"yuanshi.txt" "new.txt">"new.new"
测试比对后,发现结果,不准确,有一些是重复的,也在里面。
作者: aloha20200628 时间: 2023-6-22 13:38
调试的招法有两个要点可供参考》
一。数据文件*.txt和脚本文件*.bat(*.cmd)以及系统码页三者采用的编码方案须保持一致,所谓“三点一线”的逻辑。例如均采用默认的简中编码,文件存盘就选gbk亦即gb2312,系统码页设置就是chcp 936,也就是系统默认值;如果均采用utf-8编码方案,文件存盘就选utf-8,系统码页设置就是chcp 65001,否则屏显会出现乱码;如果数据文件和脚本文件中都没有汉字或其余双字节字符,即能被标准ascii字符集全覆盖,则存盘简中或utf-8编码皆可,系统码页采用默认即可。
二。确保第一点无误,再看 findstr 参数调整,据中外老帖多方的经验之谈,主要是 /r /i 两个参数影响双字节字符的匹配率。
本人的测试条件是 win8.1简中系统,数据文件和脚本文件均用简中编码,系统码页默认,测试结果与一楼所示无误。
作者: buyiyang 时间: 2023-6-22 14:27
回复 12# aloha20200628
问题在于findstr只支持ANSI
作者: thp2008 时间: 2023-6-22 15:47
回复 aloha20200628
问题在于findstr只支持ANSI
buyiyang 发表于 2023-6-22 14:27
不怪得
作者: aloha20200628 时间: 2023-6-22 21:06
关于findstr用法利弊的话题其实可以开一个专贴深论,此处再多说几句。
所谓ansi编码,微软把它落地中国大陆就是gb2312(GBK),对应的系统码页就是936,从记事本存盘ansi编码即知。findstr随简中windows标配,没有说不能用于中文,有限而已,如同其正则匹配用法,早已被人笑为“鸡肋”,但用者至今仍是大有人在。国内有关老帖披露了诸多findstr中文用法的经验,分享两个一看即明的帖子》https://bbs.pcbeta.com/viewthread-1925273-1-1.html,https://blog.csdn.net/u012787710/article/details/96286295。众所周知,纯P代码的疆土早已被老东家冷落,但其中的诸多奇技淫巧至今仍被后人享用,闲时品味中外老帖,有些真是精采,想来都是资深用户或老玩家在“众感山穷水尽疑无路,独辟柳暗花明又一村”的成果,也许也是他们的一种乐趣吧...
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |