标题: [文本处理] 【已解决】批处理如何将两个电话簿合并? [打印本页]
作者: 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 编辑
- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%a in ('findstr . a.txt b.txt^|sort /+7')do (
- for /f "tokens=1-4* delims=_" %%c in ("%%~nxb") do (
- set %%a3=%%e&set %%a4=%%f&set "%%a5=%%g"
- if "!t1!!t2!#"=="%%c%%d#" (
- for /l %%i in (3,1,5) do (
- if "!a.txt%%i!"=="-" set "a.txt%%i=!b.txt%%i!"
- )
- echo,%%c_%%d_!a.txt3!_!a.txt4!_!a.txt5!
- set ".="
- ) else (
- if defined . echo,!.!
- set t1=%%c&set t2=%%d&set ".=%%b"
- )
- )
- )
- if defined . echo,!.!)>new.txt
复制代码
下面的以a.txt内容为限,只更新b.txt而不添加b.txt的新内容。- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%a in ('findstr . a.txt b.txt^|sort /+7')do (
- for /f "tokens=1-4* delims=_" %%c in ("%%~nxb") do (
- set %%a3=%%e&set %%a4=%%f&set "%%a5=%%g"
- if "!t1!!t2!#"=="%%c%%d#" (
- for /l %%i in (3,1,5) do (
- if "!a.txt%%i!"=="-" set "a.txt%%i=!b.txt%%i!"
- )
- echo,%%c_%%d_!a.txt3!_!a.txt4!_!a.txt5!
- set ".="
- ) else (
- if defined . echo,!.!
- set t1=%%c&set t2=%%d&if /I "%%a"=="a.txt" (set ".=%%b")else set ".="
- )
- )
- )
- if defined . echo,!.!)>new.txt
复制代码
作者: wscript 时间: 2014-7-16 21:06
本来一句SQL就能搞定,用ADO写起来真是很拖沓。
保存为tel.vbs- set fso = CreateObject("Scripting.FileSystemObject")
- s = fso.OpenTextFile("a.txt").ReadAll()
- s = Replace( Replace(s, "_", ","), "-", " ")
- fso.OpenTextFile("a.csv",2,true).Write(s)
- s = fso.OpenTextFile("b.txt").ReadAll()
- s = Replace( Replace(s, "_", ","), "-", " ")
- fso.OpenTextFile("b.csv",2,true).Write(s)
-
- set AdoCnn = CreateObject("ADODB.Connection")
- set AdoRs = CreateObject("ADODB.Recordset")
- AdoCnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties=""text;HDR=No;FMT=Delimited""; Data Source=."
- 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
- s = AdoRs.GetString(, , ",", vbCrLf, "***")
- AdoRs.Close
- AdoCnn.Close
-
- 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 - if "!t1!!t2!#"=="%%c%%d#" (
复制代码
变量t1表示上次读取的姓名,t2表示上次读取的职务(用两个变量来比较是为了防止人物重名)
意思是:如果上次读取的姓名、职务和本次读取的姓名职务相同,则。。。。。。
你打开 一个cmd窗口运行下:- findstr . a.txt b.txt|sort /+7
复制代码
然后对着这窗口的显示内容过一遍,很好理解的。
至于以a.txt为上限,改下第13行:- set t1=%%c&set t2=%%d&iset ".=%%b"
复制代码
改为:- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |