讓我建立這個的錯誤報告有三個字長:"同步正在刪除行。"客戶端'產品來源以每晚 CSV 的形式出現,我的 Laravel 導入器重寫了它,並且在兩個文件之間的某個地方,一些 SKU 正在消失。我的第一個直覺是顯而易見的:將兩個文件扔進一個線 diff 中。 diff 回來時呈現純紅色。每一行都是"更改,"因為當晚匯出已被另一列重新排序,因此舊文件中的第 4 行是新文件中的第 900 行。該行 diff 在技術上是正確的且完全無用。我實際上需要的是一個工具,可以理解該文件是一個表格,將每行與 SKU 的對應行相匹配,並告訴我哪些記錄是真正添加、刪除或編輯的。該工具就是 Toolz CSV 差異檢查器,這本指南就是背後的原因。
TL;DR: CSV 差異將兩個 CSV 檔案作為結構化資料而不是文字行進行比較。透過關鍵列匹配行,例如
id或者
我在 Laravel 和 React 上建立 SaaS 產品,並運送 WordPress 插件,這意味著我花費大量時間協調匯出:一個系統'數據與另一個的視圖's,昨晚'今晚的快照's,客戶發誓他們發送的文件與實際到達的文件。 CSV 是所有這些語言的通用語言,正確比較兩個 CSV 是那些看起來微不足道的任務之一,直到你嘗試使用錯誤的工具來做到這一點。這是我希望沮喪版本的我讀過的指南。
什麼是 CSV 差異檢查器?
CSV 差異檢查器採用兩個 CSV 檔案(原始版本和變更版本),並報告第二個檔案與第一個檔案在行和儲存格層級上的不同之處。您將獲得四個儲存桶:僅存在於新檔案中的行(新增)、僅存在於舊檔案中的行(刪除)、兩者中存在但值不同的行(更改),以及相同(不變)的行。對於每個更改的行,一個好的工具都會深入一層並命名移動的特定列,在新行旁邊顯示舊值。
整件事發揮作用的區別在於行如何在兩個檔案中配對。 CSV 差異可以透過關鍵列進行匹配,將值視為 id 或者一個 email 作為記錄的標識,或者它可以按位置匹配,比較第一行與第一行。幾乎每次比較匯出時,金鑰匹配都是您想要的,因為每次提取資料時,同一筆記錄都可以落在不同的行上。位置匹配適用於行號本身有意義且穩定的文件,就像僅附加到其中的編號分類帳一樣。選擇正確的模式是最重要的決定,這就是為什麼 Toolz 工具將其放在前面和中心而不是猜測。
為什麼重新排序匯出時線路差異會完全變紅?
這是導致人們尋找特定於 CSV 的工具的失敗,因此值得準確理解。文字差異,即 Git 和每個程式碼編輯器中內建的類型,逐行按順序比較檔案。它運行一個演算法,可以找到最長的公共行子序列,並將其他所有內容標記為已插入或刪除。這完全適合原始程式碼,其中行順序是檔案的含義。移動一個函數,您就真正更改了文件。
CSV 匯出則相反。行順序通常是任何意外 ORDER BY 查詢碰巧使用了,並且可以在包含相同資料的兩個運行之間更改。當排序順序移動時,行差異會看到幾乎每一行都處於新位置,無法將它們對齊,並將整個檔案報告為已更改。您想要的信息(三筆記錄實際上已更改)被埋藏在數千個誤報之下。差異忠實地完成了它的工作;當你有關於記錄的問題時,它只是回答了一個關於行的問題。
CSV 差異透過先將檔案解析為行和列,然後按鍵而不是行號比較記錄來解決此問題。重新排序檔案沒有效果,因為 SKU A-1007 與 SKU 行進行比較 A-1007 在另一個文件中,無論其中一個位於何處。這就是該類別存在的全部原因,也是我伸手去拿的原因 CSV 差異工具 代替 git diff 每當文件是資料而不是程式碼時。
RFC 4180 與比較檔案有什麼關係?
一切,因為如果你不能先正確解析兩個 CSV,你就無法正確比較它們。 CSV 在任何人標準化之前已經使用了幾十年。 2005 年,IETF 發布 RFC 4180,它描述了通用格式和 text/csv MIME 類型。它不是每個工具都遵守的法律,但它是最接近共享合約的法律,它定義了樸素比較出錯的規則。
最重要的規則是引用。一個欄位可以用雙引號包裹,如果它包含逗號、雙引號或換行符,則必須如此。引用欄位內的雙引號可以透過加倍來轉義。所以值 "Doe, John" 是一個單一字段,並且 "She said ""hi""" 是值 She said "hi"。 將逗號上的每條線分開的比較將被刪除 "Doe, John" 分成兩個字段,移動後面的每一列,然後自信地報告該行在沒有更改時發生了變化。 Toolz diff 運行與為 供電的 RFC 4180 狀態機相同的 RFC 4180 狀態機 CSV 檢視器:它逐個字元地遍歷文本,追蹤它是否在引用的欄位內,並且僅在引號之外時將逗號或換行符視為分隔符號。正確解析是正確解析 diff 的先決條件,而手動滾動腳本幾乎總是跳過該部分。
如何將兩個 CSV 檔案與該工具進行比較?
流程故意簡短。將原始檔案貼到第一個框中,將變更後的檔案貼到第二個框中,或按一下「載入範例」以查看已工作的範例,其中編輯一行、新增一行、刪除一行。
確認分隔符號。自動偵測將逗號、分號、製表符和管道的分數,方法是將前幾行一致地分成相同數量的列,從而正確處理歐洲分號檔案和製表符分隔的匯出。如果您的資料偵測錯誤,請手動設定。如果每個檔案的第一行包含列名稱,則開啟標頭開關,這是為鍵列選擇器提供的內容。
現在選擇如何匹配行。從下拉式選擇一個關鍵列,通常是 id, email,或 SKU,工具透過該值比較記錄。選擇位置來逐行比較。兩個切換完善比較:如果開啟不區分大小寫的匹配 Active 和 active 應算作相同的值,並保留修剪空白,以便雜散的前導空間不會註冊為更改。點擊比較,摘要一目了然地顯示四次計數。開啟「變更」標籤以展開每個編輯的行並準確查看移動了哪些儲存格,或開啟「新增」和「刪除」標籤以將完整行視為表格。完成後,複製報告或下載會匯出每個差異的純文字摘要,包括每個變更儲存格的前後值,準備貼上到拉取請求、票證或發給客戶的電子郵件中。
我什麼時候應該按鍵與位置進行匹配?
這是決定差異有用還是噪音的選擇,所以這是我使用的規則,以表格形式列出。
| 情況 | 匹配通過 | 為什麼 |
|---|---|---|
| 可以重新排序的資料庫或 API 匯出 | 關鍵欄 | 同一張唱片每次拉動都會落在不同的線上;關鍵在於它的穩定身分 |
| 協調兩個系統'查看相同的記錄 | 關鍵欄 | 你關心記錄是否存在並且雙方都匹配,而不是它所在的位置 |
| 比較昨晚和#39;與今晚和#39;的快照 | 關鍵欄 | 隨著時間的推移,行會被添加和刪除,因此行號會漂移 |
| 僅附加日誌或具有固定順序的分類帳 | 位置 | 行號穩定且有意義; N 行是真的"第N個事件" |
| 您知道的兩個檔案共享完全相同的行順序 | 位置 | 不存在密鑰,但保證順序相同 |
| 根本沒有唯一列的檔案 | 位置 | 沒有什麼需要鍵入的,因此請按順序比較並接受限制 |
簡短版本:預設情況下進行金鑰匹配,因為大多數 CSV 都是攜帶識別碼的記錄匯出。僅當沒有可用金鑰或行順序真正是資料的一部分時,才會回退到位置匹配。如果您選擇一個鍵,並且該工具警告該列包含重複值,則表示該列實際上不是唯一的,您應該選擇更好的鍵或清理來源。正是因為 "unique" ID 列結果並非如此。
它如何顯示實際連續發生的變化?
" 的計數; 5行更改&引用;是一個開始,但您真正遇到的問題是 "如何更改?&引用; Toolz diff 回答每行。當匹配的記錄不同時,它會逐列比較兩個版本,並僅列出移動的單元格,每個單元格顯示為新值旁邊劃出的先前值。客戶行,其中僅 plan 專欄從 free 到 pro 報告單個單元格,而不是整個記錄,因此您不會左眼注視兩排長行試圖發現更改的欄位。
這種單元格級視圖是 CSV 差異透過電子表格獲得保留的地方'自己的比較功能,這些功能往往會突出顯示帶有顏色的單元格,但不會給您任何複製或貼上到評論中的內容。匯出的報告會在文字中拼出每個變更:行的鍵、列名稱以及新舊值。在實踐中,我將其直接貼到拉取請求的描述中,以便審閱者可以在不自行開啟檔案的情況下看到遷移的資料影響。結構背後也有同樣的本能 JSON 差異,報告更改了按鍵及其路徑,而不是更改了噪音線路;這兩個工具的存在是因為 "什麼改變了"是比"更好的問題;哪些行不同。&引用;
在線上比較敏感的 CSV 檔案安全嗎?
對於這個工具,是的,原因是架構性的,而不是小指的承諾。每一步,解析兩個檔案、匹配行、計算每個單元的差異以及建立報告,都會在您自己的瀏覽器標籤中以 JavaScript 形式運行。沒有上傳,沒有伺服器往返,也沒有記錄或儲存任何內容。您可以透過開啟瀏覽器'來證明這一點;網路標籤並點擊比較:頁面沒有請求離開。頁面載入後,您可以完全斷開與互聯網的連接,並且它繼續工作。
這很重要,因為人們所關注的 CSV 是企業擁有的最敏感的文件之一。客戶清單、交易匯出、薪資行、庫存表和存取日誌都以 CSV 形式傳輸。將檔案上傳到伺服器的比較工具,無論意圖多麼善意,都會將兩個私人電子表格變成其他人'日誌條目。客戶端處理消除了這個問題:資料永遠不會離開它啟動的機器。 toolz。dev 上的每個工具都故意存在這種預設,我在其中寫下了較長的參數 線上工具的資料隱私指南 對於任何想要完整推理的人。
CSV 差異如何融入實際工作流程?
差異很少是整個工作;它是管道中的一個站。我最常遇到的模式是驗證:我運行導入或遷移,然後擴展導出之前和之後,以確認腳本完全符合我的預期,僅此而已。 " 的乾淨差異;更改三,刪除零"這是比運行它的腳本中的綠色複選標記更好的遷移成功標誌。當差異顯示我無意刪除時,我在該錯誤到達生產之前而不是之後捕獲了該錯誤。
圍繞它的工具取決於文件的用途。如果我在比較之前需要將文件視為可排序的網格,那麼 CSV 檢視器 將相同的 RFC 4180 解析為表格。如果我想要的比較實際上是關於成員資格,哪些值出現在一個文件中,但不會出現在另一個文件中,而不是哪些行發生了變化,則 比較兩個列表工具 確實在單列上設定了算術,並且更適合。當資料需要成為 API 可以使用的東西時, CSV 到 JSON 轉換器 是下一跳。這些都不會上傳您的數據,因此您可以不假思索地將它們連結到同一個私人文件上。如果您正在為此類數據工作組裝套件,我的 web 開發人員工具包指南 瀏覽各個部分如何連結。
常見問題
如何比較兩個 CSV 檔案? 打開 CSV 差異檢查器,將原始 CSV 貼到第一個框中,將更改後的 CSV 貼到第二個框中,確認分隔符號和標頭設置,選擇關鍵列或位置匹配,然後按一下比較。結果被分成新增、刪除和更改的行,每個更改的行都會顯示不同的確切儲存格。所有內容都在您的瀏覽器中運行,因此檔案永遠不會上傳。
密鑰匹配和位置匹配有什麼區別?
關鍵匹配對在所選列中共享相同值的行,例如 id1,因此,無論記錄出現在任一文件中,都會將其與對應的記錄進行比較。位置匹配將第一行與第一行按文件順序進行比較。對於可以重新排序的匯出,使用金鑰匹配;對於固定順序檔案(例如僅附加日誌),使用位置匹配。
為什麼文字差異顯示資料幾乎沒有移動時每一行都發生了變化? 因為文字差異會逐行按順序比較文件。如果重新排序匯出,幾乎每一行都會落在新的位置,並且 diff 會將整個檔案標記為已更改,即使底層記錄相同。 CSV diff 將檔案解析為行和列並按鍵比較記錄,因此重新排序沒有效果,僅報告真正的變更。
它是否顯示哪個特定單元格連續變化? 是的。當匹配的行不同時,工具會按名稱列出每個更改的列,並在新值旁邊顯示先前的值。只有狀態列從活動移動到關閉的行報告單個單元格而不是標記整個行。
它支援哪些分隔符號? 逗號、分號、製表符和管道。透過選擇在前幾行中產生一致列數的分隔符,可以從第一個檔案中自動偵測分隔符,並且當資料偵測錯誤時,您可以手動覆蓋它。
如果我的關鍵列有重複的值會發生什麼? 該工具警告您密鑰列包含重複項,並且僅比較每個密鑰的第一行。重複的鍵通常意味著該列不是真正的唯一標識符,因此警告是在信任 diff 之前選擇不同鍵或清理資料的提示。
我的 CSV 檔案上傳到任何地方嗎? 否。所有解析和比較都在您的瀏覽器中使用普通的 JavaScript 本地運行。不會傳輸、記錄或儲存任何內容,您可以在沒有出現請求的網路標籤中確認它。頁面載入後,該工具也會保持離線工作。
它可以處理多大的文件? 密鑰匹配使用哈希映射而不是嵌套循環,因此它大致線性縮放並舒適地處理數萬行。實際限制是您的瀏覽器渲染非常大的結果集,而不是比較本身。



