我希望比较两大套csv文件和/或一个csv文件和一个.txt文件。我认为.txt文件可能需要转换为csv文件,只是为了简单起见,但可能需要也可能不需要。我想要使用excel,c ++或python。我需要将一个“已接受”值列表与测量列表进行比较,并找出它们之间的差异(如果有)。 Excel可能是最简单的方法,但python或c ++也可以正常工作。这不是功课,所以不要担心那种事情。非常感谢代码建议和/或模板。或链接到网站
编辑1
我已经阅读过关于Python的difflib或不同的类,但不熟悉如何使用它,可能比我想要的更多。
编辑2
文件都有一系列列(不是在它们之间绘制线条或任何东西),而在“命名”列下面会有数字。我需要比较文件1中第1列第1列中的数字与文件2中第1列第1列的数字,如果有差异则显示另一个csv文件中的差异
答案 0 :(得分:2)
您可以使用ADO(ODBC / JET / OLEDB文本驱动程序)将“体面”.txt / .csv / .tab / .flr文件作为SQL数据库中的表从每个启用COM的语言中处理。然后可以使用SQL(DISTINCT,GROUP,(LEFT)JOINS,...)的强大功能进行比较。
添加了关于您的评论:
这是你的问题,我不想把你推到你不想去的地方。但是如果需要比较表格数据,SQL是一个很好的(最好的?)工具。作为证据显示两个.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
进一步补充:
此article处理ADO和文本文件;寻找文件adoNNN.chm (NNN =版本号,例如210)在您的计算机上;这是一个good book ADO。
您可以使用Access或OpenOffice Base来试验SQL语句 应用于链接/引用(未导入!)文本数据库。
掌握了最初的障碍后,脚本/程序将很容易:连接 到数据库,即包含文件和schema.ini的文件夹 file来定义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
如果删除/忽略fat(创建SQL语句,诊断输出),它就会沸腾 低至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文本驱动程序的解析器。
增加计算:
从包含以下内容的5 x 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 =数组(“Num0”,......“Spot”) oFS.CreateTextFile(sFSpec).Write _ 加入(aFNames,sFSep)&amp; sRSep&amp; oRS.GetString(adClipString ,, sFSep,sRSep,“”)
你得到:
Num0 Num1 Num2 Num3 Num4 Spot
0,5 5 0 0 0 1
0 0 0 0 0 2
答案 1 :(得分:1)
您不需要编码,您可以使用文本编辑器中的替换功能在两个文件(空格或逗号)中使分隔符相同,并使用TortoiseSVN中的图形差异工具进行比较:http://tortoisesvn.net/