标题: [文本处理] [已解决]求助批处理的写法:覆盖更新两个文件的不同数据 [打印本页]
作者: 有理想的PIG 时间: 2019-6-24 19:42 标题: [已解决]求助批处理的写法:覆盖更新两个文件的不同数据
本帖最后由 有理想的PIG 于 2019-6-24 22:07 编辑
A.TXT 是总数据文本 组合格式 0|3XXXXX|101|股东名称 0|000XXX|101|股东名称 1|6XXXXX|101|股东名称 其中0是变量,1是变量 3XXXXXX 0XXXXXX 6XXXXX都是变量,只有|101|是固定数据(这个是匹配的关键)
B.TXT 是更新文本,要求匹配 *|******|101| 字段,然后对整行数据进行对比
1.A.TXT总数据如果无该数据,则由B.TXT复制整行过去
2.A.TXT总数据如果整行相同,则略过
3.A.TXT总数据前面 *|******|101| 相同,但是后面股东名称不同,由B.TXT的股东名称更新到A.TXT
总的一句话:覆盖更新 只更新新添加的数据和不同的数据
A.txt 的数据就一个
B.TXT数据有80个 包含 X|XXXXXX|101|股东名称 X|XXXXXX|102|股东名称 X|XXXXXX|103|股东名称 X|XXXXXX|104|股东名称..........
如何将这80个TXT 覆盖更新到A.txt
作者: xczxczxcz 时间: 2019-6-24 20:30
简单方法:把所有的B类txt合并为一个 B总.txt;再把A.TXT 追加到 B总.TXT 的后面。再对B总.TXT 去重复。然后再排序。OK.
作者: 有理想的PIG 时间: 2019-6-24 20:39
回复 2# xczxczxcz
这个好像不可行
比如有 A.TXT 0|300644|101|刘越 B.TXT 0|300644|101|王三
原本王三要替换刘越的,A和B合并后就成了
0|300644|101|王三
0|300644|101|刘越
刘越这组数据去重复是去不掉的,因为两组数据全文不相同
作者: xczxczxcz 时间: 2019-6-24 20:44
可以的。去重复 是按照 x|xxxxxx|xxx| 来判断的。会自动保留你的新的 x|xxxxxx|xxx|。
作者: xczxczxcz 时间: 2019-6-24 20:47
0|300644|101|王三
0|300644|101|刘越
程序 检测到 第二行时 ,0|300644|101| 以经在上一行定义了。后面的就会舍弃。只保留 第一行数据。所以要把 B.txt 排在前面。
作者: 有理想的PIG 时间: 2019-6-24 20:50
回复 5# xczxczxcz
求这个 X|XXXXXX|XXX| 定义的去重复代码
作者: xczxczxcz 时间: 2019-6-24 20:54
最近有点懒,不想动手,批处理 不外乎 if defined xxxxx...; pwoershell 调用 hashset类。
作者: zaqmlp 时间: 2019-6-24 21:22
本帖最后由 zaqmlp 于 2019-6-29 23:37 编辑
- @echo off
- set info=互助互利,支付宝扫码头像,感谢赞助
- rem 有问题,可加QQ956535081及时沟通
- title %info%
- cd /d "%~dp0"
- set "file1=a.txt"
- set "file2=b.txt"
- powershell -NoProfile -ExecutionPolicy bypass ^
- $t1=[IO.File]::ReadAllLines('%file1%',[Text.Encoding]::Default);^
- $t2=[IO.File]::ReadAllLines('%file2%',[Text.Encoding]::Default);^
- $text=$t1+$t2;^
- $list=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
- for($i=0;$i -lt $text.length;$i++){^
- $line=$text[$i].trimend().split('^|');^
- $s=$line[0]+'^|'+$line[1]+'^|'+$line[2];^
- if(-not $list.ContainsKey($s)){^
- $list.add($s,$line[3]);^
- }else{^
- $list[$s]=$line[3];^
- };^
- };^
- $fs=New-Object System.IO.FileStream('结果.txt', [System.IO.FileMode]::Create);^
- $sw=New-Object System.IO.StreamWriter($fs, [Text.Encoding]::Default);^
- foreach($item in $list.keys){^
- $line=$item+'^|'+$list[$item];^
- if($list[$item] -notmatch '^^\s*$'){^
- $sw.WriteLine($line);^
- $sw.Flush();^
- };^
- };^
- $sw.Close();^
- $fs.Close();
- echo;%info%
- pause
复制代码
作者: 有理想的PIG 时间: 2019-6-24 22:07
回复 8# zaqmlp
多谢老大,好像可行了 太感谢了,好人一生平安 发大财
作者: zaqmlp 时间: 2019-6-24 22:08
回复 9# 有理想的PIG
赞助才是实际
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |