簡體   English   中英

Excel 比較兩個 csv 文件並顯示差異

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM