[英]Excel comparing two csv files and showing the difference
我希望比較兩組 csv 文件和/或 csv 文件和 a.txt 文件。 為了簡單起見,我“認為”.txt 文件可能需要轉換為 csv 文件,但這可能需要也可能不需要。 我要么想使用 excel、c++ 或 python。 我需要將一個“已接受”值列表與一個已測量的列表進行比較,並找出它們之間的差異(如果有的話)。 Excel 可能是最簡單的方法,但 python 或 c++ 也可以工作。 這不是家庭作業,所以不要擔心那種事情。 非常感謝代碼建議和/或模板。 或網站鏈接
編輯 1
我讀過 Python 的 difflib 或不同的 class 但不熟悉如何使用它,可能比我想要的要多。
編輯 2
文件都將有一系列列(沒有在它們之間繪制線條或任何東西),並且在這些“命名”列下方會有數字。 我需要將文件一中第 1 列中的數字與文件 2 中第 1 列中的數字進行比較,如果存在差異,請顯示另一個 csv 文件中的差異
您可以使用 ADO(ODBC/JET/OLEDB 文本驅動程序)將 'decent'.txt/.csv/.tab/.flr 文件視為 SQL 數據庫中每種支持 COM 的語言中的表。 然后可以使用 SQL (DISTINCT, GROUP, (LEFT) JOINS, ...) 的功能進行比較。
添加了關於您的評論:
這是你的問題,我不想把你推到你不想 go 的地方。 但是 SQL 是一個很好的(最好的?)工具,如果您需要比較表格數據。 作為發現 two.txt 文件中差異的腳本的 output 的證據:
======= 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 語句。
在您掌握了最初的障礙后,腳本/程序將變得很容易:連接到數據庫,即連接到包含文件的文件夾和用於定義 files=tables 結構的 schema.ini 文件。
上面的 output 由以下人員生成:
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
如果刪除/忽略胖子(創建 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 方法很方便:只需旋轉分隔符/分隔符/Null arguments 並將其轉儲到文件
oFS.CreateTextFile( ... ).WriteLine oRS.GetString( _
adClipString, , ",", vbCrLf, ""
)
(不要忘記將該表的定義添加到您的 schema.ini 中)。 當然,您也可以使用“SELECT/INSERT INTO”,但這樣的語句可能不容易正確/通過 ADO 文本驅動程序的解析器。
加法 wrt 計算:
從包含以下內容的 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
到測量.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
您不需要編碼,您可以使用文本編輯器中的替換 function 使兩個文件(空格或逗號)中的分隔符相同,並使用 TortoiseSVN 的圖形差異工具進行比較: http://tortoisesvn.net/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.