Excel比较两个csv文件并显示差异

我期待比较两套csv文件和/或一个csv文件和一个.txt文件。 我想“.txt文件可能需要转换为一个CSV文件,只是为了简单起见,但可能或可能不需要。 我要么使用Excel,C ++或Python。 我需要比较一个“被接受的”值列表和一个被测量的列表,如果有的话,找出它们之间的差别。 Excel可能是最简单的方法,但是Python或者C ++也可以工作。 这不是功课,所以不要担心这种事情。 代码build议和/或模板非常感谢。 或链接到网站

编辑1

我已经阅读了Python的difflib或不同的类,但不熟悉如何使用它,可能比我想要的更多。

编辑2

这两个文件将有一系列的列(不是与他们之间的任何线或任何东西),并在这些“命名”列下面会有数字。 我需要比较文件1中的第一列第一列中的数字和第二列中的第一列中的数字,如果有差别,则显示另一个csv文件中的差异

您可以使用ADO(ODBC / JET / OLEDB文本驱动程序)将每个支持COM的语言的“体面”.txt / .csv / .tab / .flr文件视为SQL数据库中的表。 然后,可以使用SQL的function(DISTINCT,GROUP,(LEFT)JOINS,…)进行比较。

关于您的评论添加:

这是你的问题,我不想把你推到你不想去的地方。 但是,如果您需要比较表格数据,SQL是一个好的(最好的?)工具。 作为一个脚本的输出结果certificate了两个.txt文件中的差异:

======= The .txt files to play with ------- file1.txt "AC";"AM" 40000;-19083,00 40100;20000,00 40200;350004,00 40300;3498,99 ------- file2.txt "AC";"AM" 40000;-19083,00 40300;3498,99 40105;-234567,00 40200;350,00 ======= Some diagnostic SQL ------- <NULL> indicates: In F1 but not in F2 (LEFT JOIN) SELECT T1.AC, T1.AM, T2.AM FROM [file1.txt] AS T1 LEFT JOIN [file2.txt] AS T2 ON (T1.AC = T2.AC) ------- Result AC File1 File2 40000 -19083 -19083 40100 20000 <NULL> 40200 350004 350 40300 3498,99 3498,99 ------- <NULL> indicates: Not in the other file (LEFT JOIN, UNION) SELECT T1.AC, T1.AM, T2.AM FROM [file1.txt] AS T1 LEFT JOIN [file2.txt] AS T2 ON (T1.AC = T2.AC) UNION SELECT T2.AC, T1.AM, T2.AM FROM [file2.txt] AS T2 LEFT JOIN [file1.txt] AS T1 ON (T1.AC = T2.AC) ------- Result AC File1 File2 40000 -19083 -19083 40100 20000 <NULL> 40105 <NULL> -234567 40200 350004 350 40300 3498,99 3498,99 ------- the problems: missing, different values SELECT T1.AC, T1.AM, T2.AM FROM [file1.txt] AS T1 LEFT JOIN [file2.txt] AS T2 ON (T1.AC = T2.AC) WHERE T2.AM IS NULL OR T1.AM <> T2.AM UNION SELECT T2.AC, T1.AM, T2.AM FROM [file2. txt] AS T2 LEFT JOIN [file1.txt] AS T1 ON (T1.AC = T2.AC) WHERE T1.AM IS NULL OR T1.AM <> T2.AM ------- Result AC File1 File2 40100 20000 <NULL> 40105 <NULL> -234567 40200 350004 350 

进一步补充:

本文介绍ADO和文本文件; 在您的电脑上查找文件adoNNN.chm(NNN =版本号,例如210); 这是关于ADO的一本好书 。

您可以使用Access或OpenOffice Base来试验应用于链接/引用(不​​导入!)文本数据库的SQL语句。

掌握最初的障碍后,脚本/程序将变得简单:连接到数据库,即包含文件和schema.ini文件的文件夹,以定义files = tables的结构。

上面的输出是由以下产生的:

  Const adClipString = 2 Dim oFS : Set oFS = CreateObject( "Scripting.FileSystemObject" ) Dim sDir : sDir = oFS.GetAbsolutePathName( ".\txt" ) Dim oDB : Set oDb = CreateObject( "ADODB.Connection" ) oDB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDir & ";Extended Properties=""text""" Dim sSQL Dim sFiNa WScript.Echo "=======", "The .txt files to play with" For Each sFiNa In Array( "file1.txt", "file2.txt" ) WScript.Echo "-------", sFiNa WScript.Echo oFS.OpenTextFile( "txt\" & sFiNa ).ReadAll() Next WScript.Echo "=======", "Some diagnostic SQL" Dim aSQL For Each aSQL In Array( _ Array( "<NULL> indicates: In F1 but not in F2 (LEFT JOIN)" _ , Join( Array( _ "SELECT T1.AC, T1.AM, T2.AM FROM" _ , "[file1.txt] AS T1" _ , "LEFT JOIN [file2.txt] AS T2 ON (T1.AC = T2.AC)" _ ), " " ) ) _ , Array( "<NULL> indicates: Not in the other file (LEFT JOIN, UNION)" _ , Join( Array( _ "SELECT T1.AC, T1.AM, T2.AM FROM" _ , "[file1.txt] AS T1" _ , "LEFT JOIN [file2.txt] AS T2 ON (T1.AC = T2.AC)" _ , "UNION" _ , "SELECT T2.AC, T1.AM, T2.AM FROM" _ , "[file2.txt] AS T2" _ , "LEFT JOIN [file1.txt] AS T1 ON (T1.AC = T2.AC)" _ ), " " ) ) _ , Array( "the problems: missing, different value" _ , Join( Array( _ "SELECT T1.AC, T1.AM, T2.AM FROM" _ , "[file1.txt] AS T1" _ , "LEFT JOIN [file2.txt] AS T2 ON (T1.AC = T2.AC)" _ , "WHERE T2.AM IS NULL OR T1.AM <> T2.AM" _ , "UNION" _ , "SELECT T2.AC, T1.AM, T2.AM FROM" _ , "[file2.txt] AS T2" _ , "LEFT JOIN [file1.txt] AS T1 ON (T1.AC = T2.AC)" _ , "WHERE T1.AM IS NULL OR T1.AM <> T2.AM" _ ), " " ) ) _ ) sSQL = aSQL( 1 ) WScript.Echo "-------", aSQL( 0 ) WScript.Echo sSQL Dim oRS : Set oRS = oDB.Execute( sSQL ) WScript.Echo "------- Result" WScript.Echo Join( Array( "AC", "File1", "File2" ), vbTab ) WScript.Echo oRS.GetString( adClipString, , vbTab, vbCrLf, "<NULL>" ) Next oDB.Close 

如果你删除/忽略胖(创buildSQL语句,诊断输出),它归结为6行

  Dim oDB : Set oDb = CreateObject( "ADODB.Connection" ) oDB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDir & ";Extended Properties=""text""" sSQL = "..." Dim oRS : Set oRS = oDB.Execute( sSQL ) WScript.Echo oRS.GetString( adClipString, , vbTab, vbCrLf, "<NULL>" ) oDB.Close 

它可以轻松地移植到每个支持COM的语言中,因为ADO对象完成了所有繁重的工作。 .GetString方法在你想保存一个结果集的时候很方便:只需要把分隔符/分隔符/空参数分开并把它转储到文件

  oFS.CreateTextFile( ... ).WriteLine oRS.GetString( _ adClipString, , ",", vbCrLf, "" ) 

(不要忘记将该表的定义添加到schema.ini中)。 当然,你也可以使用“SELECT / INSERT INTO”,但是这样的语句可能不容易正确/通过ADO Text Driver的parsing器。

加法与计算:

从一个5×2主/批准文件开始,其中包含:

 Num0 Num1 Num2 Num3 Num4 7,6 6,1 3,8 0,9 8,9 0,9 9,4 4,7 8,8 9,9 

将其转换为expected.txt

 Num0 Num1 Num2 Num3 Num4 Spot 7,6 6,1 3,8 0,9 8,9 1 0,9 9,4 4,7 8,8 9,9 2 

通过附加Spot列使其符合

 [expected.txt] ColNameHeader=True CharacterSet=1252 Format=Delimited(;) Col1=Num0 Float Col2=Num1 Float Col3=Num2 Float Col4=Num3 Float Col5=Num4 Float Col6=Spot Integer 

在你的schema.ini文件中。 同样,转换一个度量文件,如:

 Num0 Num1 Num2 Num3 Num4 7,1 1,1 3,8 0,9 8,9 0,9 9,4 4,7 8,8 9,9 

到measured.txt

 Num0 Num1 Num2 Num3 Num4 Spot 7,1 1,1 3,8 0,9 8,9 1 0,9 9,4 4,7 8,8 9,9 2 

应用

  sSQL = Join( Array( _ "SELECT E.Num0 - M.Num0 AS Dif0" _ , ", E.Num1 - M.Num1 AS Dif1" _ , ", E.Num2 - M.Num2 AS Dif2" _ , ", E.Num3 - M.Num3 AS Dif3" _ , ", E.Num4 - M.Num4 AS Dif4" _ , ", E.Spot AS Spot" _ , "FROM [expected.txt] AS E" _ , "INNER JOIN [measured.txt] AS M" _ , "ON E.Spot = M.Spot" _ ), " " ) 

将结果集写入differences.txt

aFNames = Array(“Num0”,…“Spot”)oFS.CreateTextFile(sFSpec).Write _ Join(aFNames,sFSep)&sRSep&oRS.GetString(adClipString,,sFSep,sRSep,“”)

你会得到:

 Num0 Num1 Num2 Num3 Num4 Spot 0,5 5 0 0 0 1 0 0 0 0 0 2 

你不需要编码,你可以使用文本编辑器中的replacefunction使两个文件(空格或逗号)中的分隔符相同,并使用来自TortoiseSVN的graphics差异工具进行比较: http : //tortoisesvn.net/