Board logo

标题: [文件操作] [已解决] 批处理怎样找出两个文件中含有相同信息的行? [打印本页]

作者: sweet惜缘    时间: 2012-3-14 16:23     标题: [已解决] 批处理怎样找出两个文件中含有相同信息的行?

本帖最后由 sweet惜缘 于 2012-3-19 23:22 编辑

一个文件file1.xls内容为:
  ZINC_ID            MWT         LogP      apolar
ZINC00000012   289.356     1.28      4.89
ZINC00000016    256.753    2.67      6.43
ZINC00000017     281.337    1.33     3.07
...
...
另一个文件file2.xls内容为:
ZINC_ID                time        Anchors   Orientations
ZINC00000012      32            1              500
ZINC00000016       9             1               500
...
...
其中file1.xls的内容比file2.xls的内容多,并且两个文件内容都很大,约300M
现在需要在file1.xls中找出ZINC_ID与file2.xls中ZINC_ID相同的行的信息,并把这些信息另外保存起来。例如file2.xls中的ZINC00000012,则把file1.xls中“ZINC00000012 289.356 1.28 4.89”提取并保存。本来想用数据库关联做的,但由于文件太大和格式问题,不能导入数据库,所以只好求助。谢谢各位帮忙。
作者: dnfreeuser    时间: 2012-3-14 16:28

excel转到sql server不是只要导入吗?除了这几列外还有其他东西?
用数据库应该会快很多
作者: find    时间: 2012-3-14 19:10

导入数据库的时候格式有什么问题?
作者: powerbat    时间: 2012-3-14 21:10

文件那么大,不知道ADO能否胜任。结果保存在result.csv。
  1. @set @n=0//&cscript.exe -e:jscript "%~f0"&pause&exit/b
  2. file1 = "file1.xls";
  3. file2 = "file2.xls";
  4. strConnect = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="' + file1
  5.     + '";Extended Properties="Excel 8.0;IMEX=1;HDR=yes;";';
  6. AdoCnn = new ActiveXObject("ADODB.Connection");
  7. AdoCnn.ConnectionString = strConnect;
  8. AdoCnn.Open();
  9. AdoRs = new ActiveXObject("ADODB.Recordset");
  10. AdoRs.Open("SELECT a.* from ["+file1+"].[Sheet1$] as a inner join ["+file2
  11.     +"].[Sheet1$] as b  ON (a.[ZINC_ID]=b.[ZINC_ID])", AdoCnn, 3);
  12. s = AdoRs.GetString(2, AdoRs.RecordCount, ",", "\r\n");
  13. AdoRs.Close();
  14. AdoCnn.Close();
  15. fso = new ActiveXObject("Scripting.FileSystemObject");
  16. fso.OpenTextFile('result.csv', 2, true).write(s);
复制代码

作者: sweet惜缘    时间: 2012-3-15 13:14

回复 3# find

不好意思,执行不了。提示:Microsoft JET Datebase Engine:外部表不是预期的格式。我现在把文件的一部分传上来,麻烦您看看,谢谢!
作者: sweet惜缘    时间: 2012-3-15 13:16

回复 3# find

我也不清楚,不知是文件太大还是其他问题。我传一部分文件,麻烦您看看。谢谢您的帮忙。
作者: powerbat    时间: 2012-3-15 21:57

楼主都会玩数据库了,怎么还连xls文件与文本文件都分不清楚?
file1.xls只是文本文件;file2.xls才是正宗的xls文件,而且列名称不是ZINC_ID而是Molecule。
  1. @set @n=0//&cscript.exe -e:jscript "%~f0"&pause&exit/b
  2. f1 = "file1.xls";
  3. f2 = "file2.xls";
  4. fso = new ActiveXObject("Scripting.FileSystemObject");
  5. csv = fso.GetBaseName(f1) + ".csv";
  6. fso.MoveFile(f1, csv);
  7. ts = fso.OpenTextFile("Schema.ini", 2, true);
  8. ts.WriteLine("["+csv+"]\r\nFormat=TabDelimited\r\n"); ts.Close();
  9. strConnect = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="' + '.'
  10.     + '";Extended Properties="text;FMT=Delimited;HDR=yes;";';
  11. strQuery = "SELECT a.* from ["+csv+"] as a "
  12.     + " inner join (select Molecule from [查询1$]"
  13.     + " in '' [Excel 8.0;IMEX=1;HDR=yes;DATABASE="+f2+";]) as b "
  14.     + " ON (a.[ZINC_ID]=b.[Molecule])";
  15. AdoCnn = new ActiveXObject("ADODB.Connection");
  16. AdoCnn.Open(strConnect);
  17. AdoRs = AdoCnn.Execute(strQuery);
  18. s = AdoRs.GetString(2, -1, ",", "\r\n");
  19. AdoCnn.Close();
  20. fso.OpenTextFile('result.csv', 2, true).write(s);
  21. fso.MoveFile(csv, f1);
  22. fso.DeleteFile("Schema.ini");
复制代码

作者: powerbat    时间: 2012-3-16 22:33

原来楼主在这个问题上纠结了这么久,呵呵。
http://www.bathome.net/viewthread.php?tid=15247
http://www.bathome.net/viewthread.php?tid=14847
http://www.bathome.net/viewthread.php?tid=14986
可是你的求助态度有点让人不敢恭维,不与答复者回馈,没有一点认真的态度,有点像拿到答案就跑的人。
作者: sweet惜缘    时间: 2012-3-17 16:24

回复 8# powerbat


    对不起啊,这的确是我的问题,没养成答谢的习惯,我一定虚心接受您的批评,一定改正。这的确是一个不错的论坛,在这不但能学到好多知识,还能遇到您们这么多耐心帮助我们这些有问题的人,还能学到做人的道理。谢谢您们的无私奉献!但现在这个问题还没解决运行结果提示:“BOF或EOF有一个是真,或者当前的记录一倍删除,所需的操作要求一个当前的记录。”我看不懂代码,也改不了,所以还需要您的帮忙。我一直想学批处理,但找不到好的教材,麻烦您给我推荐个学习的教材。又麻烦您了,真诚的谢谢您!
作者: find    时间: 2012-3-17 16:52

回复 9# sweet惜缘


只看批处理的教程永远搞不懂那个代码,因为它其实是VBS,可以到VBS版块找几个教程学学。
作者: powerbat    时间: 2012-3-17 19:29

把cmd窗口中的出错信息贴出来。

附:
如何在CMD中使用复制粘贴功能
http://www.bathome.net/thread-9963-1-1.html
作者: sweet惜缘    时间: 2012-3-17 21:25

回复 11# powerbat


  错误提示:“ \Users\Administrator\Desktop\批处理.bat(21, 1) ADODB.Recordset: BOF 或 EOF 中
一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。”又要麻烦您了。谢谢!
作者: sweet惜缘    时间: 2012-3-17 21:26

回复 10# find


    谢谢提示,我去学学VBS!
作者: powerbat    时间: 2012-3-17 21:46

回复 12# sweet惜缘

我的win7上测试OK。
不行换这个试试
  1. @set @n=0//&cscript.exe -e:jscript "%~f0"&pause&exit/b
  2. f1 = "file1.xls";
  3. f2 = "file2.xls";
  4. fso = new ActiveXObject("Scripting.FileSystemObject");
  5. csv = fso.GetBaseName(f1) + ".csv";
  6. fso.MoveFile(f1, csv);
  7. ts = fso.OpenTextFile("Schema.ini", 2, true);
  8. ts.WriteLine("["+csv+"]\r\nFormat=TabDelimited\r\n"); ts.Close();
  9. strConnect = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="' + '.'
  10.     + '";Extended Properties="text;FMT=Delimited;HDR=yes;";';
  11. strQuery = "SELECT a.* from ["+csv+"] as a "
  12.     + " inner join (select Molecule from [查询1$]"
  13.     + " in '' [Excel 8.0;IMEX=1;HDR=yes;DATABASE="+f2+";]) as b "
  14.     + " ON (a.[ZINC_ID]=b.[Molecule])";
  15. AdoCnn = new ActiveXObject("ADODB.Connection");
  16. AdoCnn.Open(strConnect);
  17. AdoRs = new ActiveXObject("ADODB.Recordset");
  18. AdoRs.Open(strQuery, AdoCnn, 3);
  19. s = AdoRs.GetString(2, -1, ",", "\r\n");
  20. AdoRs.Close();
  21. AdoCnn.Close();
  22. fso.OpenTextFile('result.csv', 2, true).write(s);
  23. fso.MoveFile(csv, f1);
  24. fso.DeleteFile("Schema.ini");
复制代码

作者: CrLf    时间: 2012-3-18 01:03

回复 10# find


   
-e:jscript

作者: find    时间: 2012-3-18 09:11

回复 15# CrLf


你给楼主指条明路怎么去学这个东东吧
作者: sweet惜缘    时间: 2012-3-18 21:34

回复 15# CrLf


    还是提示那个错误信息,我的电脑也是win7的,也试了其他电脑都不行。很是感谢您们的热情帮忙!
作者: powerbat    时间: 2012-3-18 21:46

将s = AdoRs.GetString(2, -1, ",", "\r\n");
改为
s = "";
if (!AdoRs.EOF) s = AdoRs.GetString(2, -1, ",", "\r\n");

可能是没有符合要求的行,结果为空。(反正你提供的样本中没有。)
作者: cjiabing    时间: 2012-3-19 19:05

1、你的file1.xls应该是file1.txt,改过来。
2、你的file2.xls需要转换为txt批处理才能认。
http://www.bathome.net/thread-10512-1-1.html
下载Excel2Text.exe 并运行,设置:
file2.xls
file2.txt
查询1$
ANSI
{tab}
windows
按convertfile开始转,结果在file2.txt
3、使用file2.tx来查file1.txt
for /f  "tokens=1" %%a in (file2.txt) do findstr /i /b "%%a" file1.txt
————————
没试过结果,急事出门,晚点再说。
作者: sweet惜缘    时间: 2012-3-19 23:20

回复 18# powerbat


    试过了,解决了,很感谢您一直以来的耐心帮助!真诚的谢谢您!
作者: sweet惜缘    时间: 2012-3-19 23:21

回复 19# cjiabing


    谢谢帮忙,已解决了。




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