Board logo

标题: [文本处理] 【已解决】批处理如何将两个电话簿合并? [打印本页]

作者: pan528    时间: 2014-7-14 09:53     标题: 【已解决】批处理如何将两个电话簿合并?

本帖最后由 pan528 于 2014-7-19 15:17 编辑

一、材料

有两个不同时间保存的电话簿A簿和B簿,他们相同的项目如下:

姓名_职务_手机_办公电话_邮箱

但两者的资料都不完整:从职务到邮箱的四个项目中,两个电话簿都填写得不完整,有的

项目两个电话簿都填写了,有的分别填写了,而且人员只有一部分重叠,有的电话号码等

信息还存在相同项目不同内容的情况。

二、要求

1、以较新的A簿为主,A簿有名单的予以保留,A簿名单中没有的项目,从B簿中导入;

2、将A簿B簿合并,两项目都存在时,保留A簿的信息。

以上涉及到两文件多项对比筛选问题,总搞不定,请高手指教!
作者: DAIC    时间: 2014-7-14 14:11

请把你的两个电话薄压缩一下传上来看看
作者: pan528    时间: 2014-7-14 22:36

回复 2# DAIC


这是例子。
作者: xxpinqz    时间: 2014-7-16 14:50

本帖最后由 xxpinqz 于 2014-7-19 14:03 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1* delims=:" %%a in ('findstr . a.txt b.txt^|sort /+7')do (  
  3.     for /f "tokens=1-4* delims=_" %%c in ("%%~nxb") do (
  4.       set %%a3=%%e&set %%a4=%%f&set "%%a5=%%g"   
  5.       if "!t1!!t2!#"=="%%c%%d#" (
  6.         for /l %%i in (3,1,5) do (
  7.              if "!a.txt%%i!"=="-" set "a.txt%%i=!b.txt%%i!"
  8.         )
  9.         echo,%%c_%%d_!a.txt3!_!a.txt4!_!a.txt5!
  10.         set ".="
  11.       ) else (
  12.         if defined . echo,!.!
  13.         set t1=%%c&set t2=%%d&set ".=%%b"
  14.       )   
  15.     )
  16. )
  17. if defined . echo,!.!)>new.txt
复制代码
下面的以a.txt内容为限,只更新b.txt而不添加b.txt的新内容。
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1* delims=:" %%a in ('findstr . a.txt b.txt^|sort /+7')do (   
  3.     for /f "tokens=1-4* delims=_" %%c in ("%%~nxb") do (
  4.       set %%a3=%%e&set %%a4=%%f&set "%%a5=%%g"   
  5.       if "!t1!!t2!#"=="%%c%%d#" (
  6.        for /l %%i in (3,1,5) do (
  7.           if "!a.txt%%i!"=="-" set "a.txt%%i=!b.txt%%i!"
  8.        )
  9.        echo,%%c_%%d_!a.txt3!_!a.txt4!_!a.txt5!
  10.         set ".="
  11.       ) else (
  12.         if defined . echo,!.!
  13.         set t1=%%c&set t2=%%d&if /I "%%a"=="a.txt" (set ".=%%b")else set ".="
  14.       )   
  15.     )
  16. )
  17. if defined . echo,!.!)>new.txt
复制代码

作者: wscript    时间: 2014-7-16 21:06

本来一句SQL就能搞定,用ADO写起来真是很拖沓。
保存为tel.vbs
  1. set fso = CreateObject("Scripting.FileSystemObject")
  2. s = fso.OpenTextFile("a.txt").ReadAll()
  3. s = Replace( Replace(s, "_", ","), "-", " ")
  4. fso.OpenTextFile("a.csv",2,true).Write(s)
  5. s = fso.OpenTextFile("b.txt").ReadAll()
  6. s = Replace( Replace(s, "_", ","), "-", " ")
  7. fso.OpenTextFile("b.csv",2,true).Write(s)
  8. set AdoCnn =  CreateObject("ADODB.Connection")
  9. set AdoRs = CreateObject("ADODB.Recordset")
  10. AdoCnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties=""text;HDR=No;FMT=Delimited""; Data Source=."
  11. AdoRs.Open "select * from (select a.f1 as h, IIF(a.f2,a.f2,b.f2) as i, IIF(a.f3,a.f3,b.f3) as j, IIF(a.f4,a.f4,b.f4) as k, IIF(a.f5,a.f5,b.f5) as l FROM [a.csv] as a LEFT JOIN [b.csv] as b on a.f1=b.f1 UNION SELECT b.* FROM [a.csv] as a RIGHT JOIN [b.csv] as b on a.f1=b.f1 where a.f1 Is NULL) order by k", AdoCnn
  12. s = AdoRs.GetString(, , ",", vbCrLf, "***")
  13. AdoRs.Close
  14. AdoCnn.Close
  15. fso.OpenTextFile("all.csv",2,true).Write(s)
复制代码

作者: pan528    时间: 2014-7-17 23:17

回复 4# xxpinqz

非常感谢回帖!!!
思路很巧妙!我要好好消化一下。

但不知道哪里的问题,new.txt的结果中漏掉了A.txt中的“赵林锋_总经理_13567852228”?

请帮助修改一下。
作者: pan528    时间: 2014-7-17 23:19

回复 5# wscript

谢谢回帖,但运行后没有得到我想要的结果。
作者: wscript    时间: 2014-7-17 23:24

回复 7# pan528


    报了什么错误?还是内容不对,或者有遗漏?
作者: pan528    时间: 2014-7-18 06:30

回复 8# wscript


运行结果只是将格式“_” 改成了“,”,并没有将两个电话簿合并,不知道是程序错误出在哪里,请试试下列范本:

A.txt

陈国平_董事长_-_62660859_-
褚波霞_管理人员_13957473238_62721977_
姚爱月_总经理[email]_13867826766_62163913_yay@mail.fytvu.net.cn[/email]
赵林锋_总经理_13567852228_
沈晓峰_总经理_-_62260114_-
干新建_厂长[email]_13605841066_62232617_gxj@mail.fytvu.net.cn[/email]
张建军_总经理[email]_-_6224760_zjj@mail.fytvu.net.cn[/email]
陈海涛_总经理_13805803299_62151183_-
高先苗_总经理_13905845601_62157288_-
宋长洪_总经理[email]_13805801507_62175007_sch@mail.fytvu.net.cn[/email]
黄丽锋_开发科长[email]_13780021091_62760536_hlf@mail.fytvu.net.cn[/email]
夏秋娣_管理人员[email]_13003757838_62760548_xqt@mail.fytvu.net.cn[/email]
盛哲辉_财务部长_13780021086_62760588_-
董伯均_总经理_13505780638_62260393_
施鹏程_总经理[email]_13003787074_62358789_spc@mail.fytvu.net.cn[/email]
谢明华_副总裁[email]_-_62538090_xmh@mail.fytvu.net.cn[/email]

B.txt
陈国平_董事长[email]_13805805986_62660858_cgp@mail.fytvu.net.cn[/email]
黄金平_主任_13505787822_62080698_-
褚波霞_管理人员_-_62721977_-
沈晓峰_总经理[email]_13805805818_62260114_sxf@mail.fytvu.net.cn[/email]
干新建_厂长[email]_13605841066_-_gxj@mail.fytvu.net.cn[/email]
张建军_总经理_13805809606_6224760_-
吴忠鑫_经理_-_62499003_-
陈海涛_总经理[email]_13805803220_62151183_cht@mail.fytvu.net.cn[/email]
盛哲辉_财务部长_-_62760543_-
董伯均_总经理_-_62260393_-
王文鉴_总裁[email]_13805801288_-_wwq@mail.fytvu.net.cn[/email]
谢明华_副总裁_13336663608_-_-
作者: xxpinqz    时间: 2014-7-18 12:17

回复 6# pan528

编辑时加组括号,忘了改变量,把最后一行的echo,%.%改为echo,!.!即可
作者: wscript    时间: 2014-7-18 22:31

回复 9# pan528


    代码已经用3楼的样本进行了测试。你看看生成的all.csv,跟你想要的结果有什么出入。
作者: pan528    时间: 2014-7-18 22:43

回复 11# wscript

运行后只有“a.csv”和“b.csv”没有看到“all.csv”!
作者: pan528    时间: 2014-7-18 22:51

回复 10# xxpinqz


谢谢!通过了测试。

请教一下:“if "!t1!!t2!#"=="%%c%%d#"”,这个判断句。

我很菜,不知道怎样去过滤已经使用过的数据。没有看明白。

另外,如果合并的内容,只以A.txt上的人员为限,程序要怎么改?
作者: wscript    时间: 2014-7-19 08:25

回复 12# pan528


    那就奇怪了,如果没报错,all.csv肯定会生成的。
作者: pan528    时间: 2014-7-19 09:50

回复 14# wscript


真不好意思,VBS我看不懂,但很感谢你给我提供解决办法。

能否麻烦你下载三楼的范本或直接粘贴九楼的范本测试一下,找找原因?我测试了好几次,都没有生成“all.csv”。

再次感谢你的热心回帖!
作者: xxpinqz    时间: 2014-7-19 13:57

本帖最后由 xxpinqz 于 2014-7-19 13:59 编辑

回复 13# pan528
  1. if "!t1!!t2!#"=="%%c%%d#" (
复制代码
变量t1表示上次读取的姓名,t2表示上次读取的职务(用两个变量来比较是为了防止人物重名)
意思是:如果上次读取的姓名、职务和本次读取的姓名职务相同,则。。。。。。

你打开 一个cmd窗口运行下:
  1. findstr . a.txt b.txt|sort /+7
复制代码
然后对着这窗口的显示内容过一遍,很好理解的。

至于以a.txt为上限,改下第13行:
  1. set t1=%%c&set t2=%%d&iset ".=%%b"
复制代码
改为:
  1. set t1=%%c&set t2=%%d&if /I "%%a"=="a.txt" (set ".=%%b")else set ".="
复制代码
全部更新至4楼
作者: pan528    时间: 2014-7-19 15:15     标题: RE: 批处理如何将两个电话簿合并?

回复 16# xxpinqz

谢谢指点!

两组代码都通过了测试。

再次表示感谢!




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