Board logo

标题: [文本处理] [已解决]求助批处理的写法:覆盖更新两个文件的不同数据 [打印本页]

作者: 有理想的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 编辑
  1. @echo off
  2. set info=互助互利,支付宝扫码头像,感谢赞助
  3. rem 有问题,可加QQ956535081及时沟通
  4. title %info%
  5. cd /d "%~dp0"
  6. set "file1=a.txt"
  7. set "file2=b.txt"
  8. powershell -NoProfile -ExecutionPolicy bypass ^
  9.     $t1=[IO.File]::ReadAllLines('%file1%',[Text.Encoding]::Default);^
  10.     $t2=[IO.File]::ReadAllLines('%file2%',[Text.Encoding]::Default);^
  11.     $text=$t1+$t2;^
  12.     $list=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
  13.     for($i=0;$i -lt $text.length;$i++){^
  14.         $line=$text[$i].trimend().split('^|');^
  15.         $s=$line[0]+'^|'+$line[1]+'^|'+$line[2];^
  16.         if(-not $list.ContainsKey($s)){^
  17.             $list.add($s,$line[3]);^
  18.         }else{^
  19.             $list[$s]=$line[3];^
  20.         };^
  21.     };^
  22.     $fs=New-Object System.IO.FileStream('结果.txt', [System.IO.FileMode]::Create);^
  23.     $sw=New-Object System.IO.StreamWriter($fs, [Text.Encoding]::Default);^
  24.     foreach($item in $list.keys){^
  25.         $line=$item+'^|'+$list[$item];^
  26.         if($list[$item] -notmatch '^^\s*$'){^
  27.             $sw.WriteLine($line);^
  28.             $sw.Flush();^
  29.         };^
  30.     };^
  31.     $sw.Close();^
  32.     $fs.Close();
  33. echo;%info%
  34. 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