中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求一个对比Excel文件的批处理bat vbs随便什么都行
« [1] [2] »
作者:
标题: 求一个对比Excel文件的批处理bat vbs随便什么都行 取消高亮 | 上一主题 | 下一主题
loquat
初级用户





积分 81
发帖 80
注册 2009-8-30
状态 离线
『楼 主』:  求一个对比Excel文件的批处理bat vbs随便什么都行

两个xls文件的前两列完全一致。只有第三列不同。并且第三列所有行只有6种内容。
要求将a.xls和b.xls的内容作对比,一行为一项,统计出变化的项的数量,并导出内容到txt或者xls也行。
内容格式例如下:
a.xls
A        B        C
000001   发展A   保留意见
000002   进步B   --
000003   流*动C  带强调事项段的无保留意见

b.xls
A        B        C
000001   发展A   --
000002   进步B   保留意见
000003   流*动C  带强调事项段的无保留意见

要求最后的结果是:
c.txt
A        B        C        D
000001   发展A   保留意见  --
000002   进步B   --        保留意见

C行的6种内容如下:
“标准无保留意见”可记为0;“带强调事项段的无保留意见”可记为1;“无法表示意见”可记为2;“保留意见”可记为3;“否定意见”可记为4;“未披露审计意见类型”可记为5;“--”可记为6

不知道这个难不难,好像从来没见过这种批处理。。。
大侠们帮帮忙,说说可以怎么实现,只要可以实现不管怎么弄都行。

2010-3-30 12:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 2 楼』:  

Excel中使用统计函数就可以直接实现



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-30 12:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
loquat
初级用户





积分 81
发帖 80
注册 2009-8-30
状态 离线
『第 3 楼』:  

谢谢兄弟,那我先去学学这个怎么用。。。

[ Last edited by loquat on 2010-3-30 at 13:06 ]

2010-3-30 13:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 4 楼』:  


Dim xls1, xls2, valMap, fso, excel, wbs, sht1, sht2, i, n, result, resultString
xls1 = "C:\Documents and Settings\issuser\桌面\a.xls"
xls2 = "C:\Documents and Settings\issuser\桌面\b.xls"
result = "不同的地方.txt"
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set valMap = WScript.CreateObject("Scripting.Dictionary")
With valMap
        .Add "标准无保留意见", 0
        .Add "带强调事项段的无保留意见", 1
        .Add "无法表示意见", 2
        .Add "保留意见", 3
        .Add "否定意见", 4
        .Add "未披露审计意见类型", 5
        .Add "--", 6
End With
Set excel = WScript.CreateObject("Excel.Application")
Set wbs = excel.Application.Workbooks
wbs.Open xls1
wbs.Open xls2
Set sht1 = wbs.Item(1).Sheets(1)
Set sht2 = wbs.Item(2).Sheets(1)
i = 1
n = 0
resultString = "A" & vbTab & "B" & vbTab & "C" & vbTab & "D"
Do
        If a(i, 3) <> b(i, 3) Then
                resultString = resultString & vbNewLine & _
                        a(i, 1) & vbTab & a(i, 2) & vbTab & c(a(i, 3)) & vbTab & c(b(i, 3))
                n = n + 1
        End If
        i = i + 1
Loop Until sht1.Cells(i, 3) = ""
resultString = "总共有 " & n & " 项不同。" & vbNewLine & vbNewLine & resultString
fso.CreateTextFile(result, True).Write resultString
excel.Quit
MsgBox "比较结果保存到了 " & vbCrLf & vbCrLf & fso.GetFile(result).Path, 64, "完成"

Function a(i, j)
        a = sht1.Cells(i, j).Value
End Function

Function b(i, j)
        b = sht2.Cells(i, j).Value
End Function

Function c(s)
        Dim temp
        temp = valMap(s)
        If temp = "" Then temp = s
        c = temp
End Function
[ Last edited by qinchun36 on 2010-3-30 at 16:17 ]



┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2010-3-30 14:04
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
loquat
初级用户





积分 81
发帖 80
注册 2009-8-30
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by qinchun36 at 2010-3-30 14:04:

....
    感谢大侠出手帮助!
    还能不能对得出的txt文件再分别按C列和D列做排序处理?
    按0->6的顺序,谢谢。
   

   还是这边气氛好,我在verybat那边发的帖都没人理睬我!不过也怪我自己太菜了。就知道成天收藏别人的批处理,从来没自己尝试写过。。。

现在的文件已经成了这样。。。

  Quote:
总共有 123 项不同。

A        B        C        D
000017        SST中华A        3        0
000028        一致药业        3        0
000030        *ST盛润A        3        0
000033        新都酒店        3        0
000045        深纺织A        0        3
000048        ST康达尔        3        0
000058        深赛格        3        0
000150        宜华地产        0        2
000404        华意压缩        3        0
000410        沈阳机床        0        3

[ Last edited by loquat on 2010-3-30 at 15:29 ]

附件 1: 2000-2001.rar (2010-3-30 14:50, 40.73 K,下载次数: 6)
2010-3-30 14:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 6 楼』:  

上面的代码没有注意数有多少条改变了,已经重新修改了一个小地方。

排序excel里面就有的,这个结果里面的文本是用 Tab 分隔的,
全选复制文本,新建一个excel表,直接CTRL+V粘贴到里面就可以。
然后点“排序和筛选”的“自定义排序”,在这个界面就可以操作了,还可以添加排序条件。

[ Last edited by qinchun36 on 2010-3-30 at 16:16 ]

附件 1: excel_sort.GIF (2010-3-30 16:09, 17.75 K)




┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2010-3-30 16:09
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
loquat
初级用户





积分 81
发帖 80
注册 2009-8-30
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by qinchun36 at 2010-3-30 16:09:
上面的代码没有注意数有多少条改变了,已经重新修改了一个小地方。

排序excel里面就有的,这个结果里面的文本是用 Tab 分隔的,
...

但是用Excel按C排序后好像ABD行没有对应变换顺序哦?

2010-3-30 17:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 8 楼』:  

.....

excel 基本操作啊,不要去点哪一列,全选之后再排序



┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2010-3-30 17:25
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
loquat
初级用户





积分 81
发帖 80
注册 2009-8-30
状态 离线
『第 9 楼』:  

囧,我以为我电脑算是入门了,没想到还是这么菜啊。
看来水还是很深,继续加油。。。

2010-3-30 17:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
loquat
初级用户





积分 81
发帖 80
注册 2009-8-30
状态 离线
『第 10 楼』:  

大侠还能顺手给个没有变化的项目列表不?

2010-3-30 17:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 11 楼』:  


@echo off&setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=        " %%a in (2000.txt) do set "%%a%%b=%%c"
for /f "tokens=1-3 delims=        " %%d in (2001.txt) do (
if not "!%%d%%e!"=="%%f" (set/a n+=1
call :i !%%d%%e!
set d=!i!
call :i %%f
set f=!i!
echo %%d                %%e        !d!        !f!))>>输出文件.txt
echo 总共有 %n% 不同。>>输出文件.txt
exit
:i
set i=%1
set i=%i:标准无保留意见=0%
set i=%i:带强调事项段的无保留意见=1%
set i=%i:无法表示意见=2%
set i=%i:保留意见=3%
set i=%i:否定意见=4%
set i=%i:未披露审计意见类型=5%
set i=%i:--=6%
将两个xls文件用excel 打开,复制有效内容到2000.txt和2001.txt中。
注意,批脚本中出现的连续空格实际是一个制表符。
if not "!%%d%%e!"=="%%f" (set/a n+=1 中去掉not得到的就是相同内容的列表

[ Last edited by Hanyeguxing on 2010-3-30 at 17:51 ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 loquat 分数: +1  时间:2010-3-30 22:22




批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-30 17:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 12 楼』:  

如果不需要替换,那么只用
findstr /x /g:2000.txt 2001.txt >temp.txt
就可以生成。
如果要得到相同部分且需要替换代码则:
@echo off&setlocal enabledelayedexpansion
findstr /x /g:2000.txt 2001.txt >temp.txt
for /f "delims=" %%i in (temp.txt) do (set i=%%i
set i=!i:标准无保留意见=0!
set i=!i:带强调事项段的无保留意见=1!
set i=!i:无法表示意见=2!
set i=!i:保留意见=3!
set i=!i:否定意见=4!
set i=!i:未披露审计意见类型=5!
set i=!i:--=6!
echo !i!)>>相同.txt
del /q temp.txt
如果同时需要按代码陪列顺序,则可以:
@echo off&setlocal enabledelayedexpansion
findstr /x /g:2000.txt 2001.txt >temp.txt
for /f "tokens=1-3 delims=        " %%a in (temp.txt) do (set i=%%c
set i=!i:标准无保留意见=0!
set i=!i:带强调事项段的无保留意见=1!
set i=!i:无法表示意见=2!
set i=!i:保留意见=3!
set i=!i:否定意见=4!
set i=!i:未披露审计意见类型=5!
set i=!i:--=6!
set "hanye_!i!%%a=%%b")
for /f "tokens=1,2 delims==" %%i in ('set^|find /i "hanye_"') do (set i=%%i
echo !i:~7!        %%j        !i:~6,1!)>>相同.txt
del /q temp.txt
注意,批脚本中出现的连续空格实际是一个制表符。

[ Last edited by Hanyeguxing on 2010-3-30 at 18:18 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-30 18:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
loquat
初级用户





积分 81
发帖 80
注册 2009-8-30
状态 离线
『第 13 楼』:  

风舞九天果然神人!感谢两位大力帮助,问题已经完美解决,我帮的那位MM很高兴。。。
嘿嘿。。。

2010-3-30 18:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 14 楼』:  

有一行是 If a(i, 3) <> b(i, 3) Then
改成 If a(i, 3) = b(i, 3) Then 就是相同的了

   此帖被 +1 点积分    点击查看详情   
评分人:【 loquat 分数: +1  时间:2010-3-30 22:21




┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2010-3-30 18:34
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
loquat
初级用户





积分 81
发帖 80
注册 2009-8-30
状态 离线
『第 15 楼』:  

为了帮助小弟泡MM,两位大侠可能还要再关注下此贴。同样的数据她还要得出其他的比较结果。
先感谢两位。。。

[ Last edited by loquat on 2010-3-30 at 22:30 ]

2010-3-30 22:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: