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

[文本处理] 【已解决】批处理比对两个文本文件的问题

本帖最后由 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,命令行下,就显示乱码。

只要能完成,比较这两个文本文件的行就行,不管用什么方式,第三方工具也行,我需要的是结果。

这两个问题,该如何处理。感谢大家。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 77七 于 2023-6-21 11:13 编辑
  1. @echo off
  2. chcp 65001
  3. for /f "usebackq delims=" %%a in ("yuanshi.txt") do (
  4.         set _"%%a"=1
  5. )
  6. (for /f "usebackq delims=" %%a in ("new.txt") do (
  7.         if not defined _"%%a" (
  8.                 echo %%a
  9.                 set /a n+=1
  10.         )
  11. ))>new.xxx
  12. move /y new.xxx new.txt
  13. echo %n%
  14. pause
复制代码

文本行较少,可以使用批处理。
把文本和批处理都保存为utf-8编码格式
使用前先备份
1

评分人数

bat小白,请多指教!谢谢!

TOP

回复 1# thp2008

将“yuanshi.txt” 及 “new.txt” 以ANSI编码保存,下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe ),执行如下指令后“out.txt”即为你所需要的结果:
  1. 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处置
1

评分人数

TOP

本帖最后由 thp2008 于 2023-6-21 11:39 编辑

回复 2# 77七

感谢,非常好用,两个要求都满足了。高手。

另外,我想问下,我想将输出的New.txt,统计所有有文字的行数,该如何统计,谢谢!

TOP

回复 3# hfxiang

感谢你的帮助,我试了一下,这个方法也可以,但是就是保存为ANSI,会产生少量特别的汉字,乱码的问题不行。

第二个工具可以。

TOP

回复 4# thp2008


   已在2楼代码上修改。
bat小白,请多指教!谢谢!

TOP

回复  thp2008


   已在2楼代码上修改。
77七 发表于 2023-6-21 11:14


非常感谢

TOP

本帖最后由 buyiyang 于 2023-6-21 14:15 编辑

http://www.bathome.net/viewthread.php?tid=43845启发,用比较二进制的方法写了一个
  1. @echo off
  2. call :diff "yuanshi.txt" "new.txt"
  3. pause&exit
  4. :diff
  5. echo,>>%1&echo,>>%2
  6. for %%i in (%1 %2) do (
  7.     fsutil file creATenew "new_%%~i" %%~zi >nul
  8.     (for /f "tokens=2" %%a in ('fc /b %%i "new_%%~i" ^| findstr /irc:"[0-9A-F]*: [0-9A-F][0-9A-F] 00"') do (
  9.         set /p=%%a
  10.         if /i "%%a"=="0A" echo,
  11.         ))<nul >"new-%%~i"
  12.     del "new_%%~i"
  13.     )
  14. findstr /ivxg:"new-%~1" "new-%~2" >result.txt
  15. del "new-%~1" "new-%~2"
  16. certutil -decodehex -f result.txt result.txt
复制代码
1

评分人数

TOP

本帖最后由 thp2008 于 2023-6-21 11:37 编辑

回复 8# buyiyang

我测试了,可以,没有问题。

输出结果在result.txt中,完全正确。

TOP


借一楼题目可以复习纯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)
1

评分人数

TOP

本帖最后由 thp2008 于 2023-6-22 11:29 编辑

回复 10# aloha20200628

学习中,感谢分享!
但是我使用
  findstr /rv /g:"yuanshi.txt" "new.txt">"new.new"

测试比对后,发现结果,不准确,有一些是重复的,也在里面。

TOP


调试的招法有两个要点可供参考》
     一。数据文件*.txt和脚本文件*.bat(*.cmd)以及系统码页三者采用的编码方案须保持一致,所谓“三点一线”的逻辑。例如均采用默认的简中编码,文件存盘就选gbk亦即gb2312,系统码页设置就是chcp 936,也就是系统默认值;如果均采用utf-8编码方案,文件存盘就选utf-8,系统码页设置就是chcp 65001,否则屏显会出现乱码;如果数据文件和脚本文件中都没有汉字或其余双字节字符,即能被标准ascii字符集全覆盖,则存盘简中或utf-8编码皆可,系统码页采用默认即可。
     二。确保第一点无误,再看 findstr 参数调整,据中外老帖多方的经验之谈,主要是 /r /i 两个参数影响双字节字符的匹配率。

本人的测试条件是 win8.1简中系统,数据文件和脚本文件均用简中编码,系统码页默认,测试结果与一楼所示无误。

TOP

回复 12# aloha20200628

问题在于findstr只支持ANSI

TOP

回复  aloha20200628

问题在于findstr只支持ANSI
buyiyang 发表于 2023-6-22 14:27



    不怪得

TOP


   关于findstr用法利弊的话题其实可以开一个专贴深论,此处再多说几句。
   所谓ansi编码,微软把它落地中国大陆就是gb2312(GBK),对应的系统码页就是936,从记事本存盘ansi编码即知。findstr随简中windows标配,没有说不能用于中文,有限而已,如同其正则匹配用法,早已被人笑为“鸡肋”,但用者至今仍是大有人在。国内有关老帖披露了诸多findstr中文用法的经验,分享两个一看即明的帖子》https://bbs.pcbeta.com/viewthread-1925273-1-1.htmlhttps://blog.csdn.net/u012787710/article/details/96286295。众所周知,纯P代码的疆土早已被老东家冷落,但其中的诸多奇技淫巧至今仍被后人享用,闲时品味中外老帖,有些真是精采,想来都是资深用户或老玩家在“众感山穷水尽疑无路,独辟柳暗花明又一村”的成果,也许也是他们的一种乐趣吧...

TOP

返回列表