İki CSV dosyasını karşılaştırma ve değişiklikleri bulma

İki CSV dosyasını karşılaştırmanın en hızlı yolu, her ikisini de yan yana bir diff aracına yapıştırmak, sütunları hizalamak ve vurgulanan satırları okumaktır. Karşılaştırma kolay kısımdır. İnsanları zorlayan şey gürültüdür: yeniden sıralanmış bir dışa aktarım, virgül yerine noktalı virgül ya da birinin tırnak içine aldığı bir değer, aynı verileri içeren iki dosyanın hiçbir ortak yanı yokmuş gibi görünmesine yol açabilir.

Bu kılavuz, temiz ve güvenilir bir CSV diff'ini nasıl elde edeceğinizi anlatıyor. İki eşdeğer dışa aktarımın kâğıt üzerinde neden ayrıştığına, hangi yöntemleri bilmeye değer olduğuna ve takip edebileceğiniz işlenmiş bir örneğe bakacağız. Sadece aracı istiyorsanız, CSV karşılaştırma sayfamız bunu tarayıcıda yapar.

CSV dosyalarını karşılaştırmak neden aldatıcı derecede zordur

CSV basit görünür, ancak tek bir katı standardı yoktur. En yakını RFC 4180'dir ve gerçek dünyadaki pek çok dosya buna uymaz. Aynı tablonun iki dışa aktarımı; sınırlayıcı, tırnak, satır sonları ve satır sırası bakımından farklı olabilir ama tam olarak aynı verileri tanımlayabilir. Düz bir metin diff'i bunların hiçbirini bilmez, bu yüzden hepsini işaretler.

Başlamadan önce karar vermeniz gereken kilit nokta şu: satır sırası sizin için önemli mi? Ada göre sıralanmış bir veritabanı dışa aktarımı ve aynı dışa aktarımın ID'ye göre sıralanmış hali aynı kayıt kümesini içerir, ama bir satır diff'i neredeyse her satırı kırmızı ve yeşile boyar. Satırların kararlı bir anahtarı varsa (bir ID sütunu), her iki dosyayı önce o anahtara göre sıralamak diff'i yeniden okunabilir hale getirir.

Değişiklik gibi görünür, genellikle değildir
Diff'te gördüğünüzGerçek bir değişiklik mi?Ne yapmalı
Farklı sıradaki satırlarHayır, veriler aynı kümeyseHer iki dosyayı bir anahtar sütununa göre sıralayın
Virgül vs. noktalı virgül sınırlayıcıHayır, aynı alanlarTek bir sınırlayıcıya normalleştirin
Ada vs. "Ada"Hayır, tırnaklar burada isteğe bağlıTırnakları normalleştirin
CRLF vs. LF satır sonlarıHayırSatır sonlarını normalleştirin
Sondaki boş bir satırHayırKırpın
Bir hücre değeri değiştiEvetİnceleyin, bu gerçek

Sınırlayıcı satırı pek çok kişiyi yakalar, özellikle bölgeler arası: birçok Avrupa yerel ayarı virgülü ondalık ayırıcı olarak kullandığından noktalı virgül kullanır. Aynı veriler, farklı ayırıcı. Tarayıcıların ve araçların tablo biçimindeki metni nasıl okuduğuyla ilgili ayrıntı isterseniz, MDN'nin tarayıcıda dosya okuma notu yararlı bir başlangıç noktasıdır.

CSV karşılaştırmanın dört yolu ve hangisine ne zaman başvurulur

Tek bir en iyi yöntem yoktur. Dosyaların boyutuna ve satır sırasının önemli olup olmadığına bağlıdır. Yaygın seçenekler şöyle kıyaslanır.

YöntemEn uygun olduğu durumÇabaCSV'yi anlar mı?
Gözle bakmakÇok küçük dosyalar, birkaç satırDüşükHayır, ayrıştırıcı sizsiniz
Online diff aracıHızlı kontroller, her yerden yapıştırmaDüşükSatır satır, evet
Elektronik tablo uygulamasıGörsel inceleme, formüller, filtrelemeOrtaEvet, ama manuel
Komut satırı (sort, csvkit)Büyük dosyalar, betikleme, anahtarlı karşılaştırmalarOrtaEvet, önce sıralarsanız

Çoğu kişi için bir tarayıcı aracı hız açısından kazanır: kurulacak bir şey yok ve bir dışa aktarımı doğrudan bir indirmeden ya da bir veritabanı istemcisinden yapıştırabilirsiniz. İşin püf noktası, hemen ele alacağımız satır sırası ve sınırlayıcı gürültüsüdür. Çok büyük dosyalar için komut satırında csvkit öğrenmeye değer.

En hızlı temiz karşılaştırma, adım adım

Biri bana iki dışa aktarım verip "ne farklı?" diye sorduğunda kullandığım rutin budur. Bir dakikadan az sürer.

  1. Her iki dosyanın da aynı sınırlayıcıyı kullandığından ve aynı başlık satırına sahip olduğundan emin olun.
  2. Satır sırası önemli değilse, her iki dosyayı önce bir anahtar sütununa göre sıralayın.
  3. CSV karşılaştırma aracını açın.
  4. Orijinali sola, yeni sürümü sağa yapıştırın.
  5. Sonucu okuyun. Yeşil eklenen bir satır, kırmızı kaldırılan bir satırdır ve değişen bir hücre her birinden biri olarak görünür.

Satırlar sırasızken işin tüm sırrı ikinci adımdır. Her iki dosya da aynı şekilde sıralandığında, vurgulanacak tek şey gerçekten değişen satırlardır. Diff motorumuz Google'ın diff-match-patch kütüphanesi üzerine kuruludur; önce satır satır karşılaştırdığından uzun dosyalarda bile hızlı kalır.

İşlenmiş bir örnek

Diyelim ki bir kullanıcı tablosundaki bir değişikliği inceliyorsunuz. İşte öncesi:

id,name,role,seats
7,Ada Lovelace,editor,3
8,Alan Turing,viewer,1

Ve işte sonrası, farklı bir satır sırasında dışa aktarılmış:

id,name,role,seats
8,Alan Turing,viewer,1
7,Ada Lovelace,admin,5

Bunları ham bir satır diff'ine atın ve her iki veri satırı da değişmiş gibi görünür, çünkü yer değiştirdiler. Her ikisini de id sütununa göre sıralayın, gerçek hikaye kısadır:

Gerçekte ne değişti
Satır (id'ye göre)SütunÖncesiSonrasıDeğişiklik
7roleeditoradminDeğiştirildi
7seats35Değiştirildi
8Değişiklik yok (yalnızca taşındı)

Tek bir gerçek düzenleme: Ada'nın rolü ve koltuk sayısı değişti. Alan'ın satırı yalnızca taşındı. editor'den admin'e bu yükselme, incelemede yakalamak isteyeceğiniz türden bir şeydir ve diff'in yanlışlıkla değişmiş olarak işaretlediği satırların altına gömüldüğünde gözden kaçırması kolaydır.

Komut satırında satır sırası gürültüsünü yok etme

Dosyalarınız zaten diskteyse ve satırların doğal bir sırası yoksa, aynı "önce sırala" fikri iki kısa komutla işe yarar. Başlığı yerinde tutun ve gerisini sıralayın:

(head -1 old.csv; tail -n +2 old.csv | sort) > old.sorted.csv
(head -1 new.csv; tail -n +2 new.csv | sort) > new.sorted.csv
diff old.sorted.csv new.sorted.csv

Artık diff yalnızca gerçekten değişen satırları bildirir, çünkü her iki dosya da aynı sıradadır. Sütun sırasını da göz ardı eden anahtarlı karşılaştırmalar için csvkit'in csvsort ve csvjoin komutları size daha fazla denetim sağlar. Bu, tarayıcıda karşılaştırmadan önce her iki tarafı sıralamanın terminal karşılığıdır.

Sınırlayıcılar, tırnaklar ve dağınık gerçeklik

Gerçek CSV dosyaları kuralları sürekli çiğner. Virgül içeren bir alan tırnak içine alınmalıdır, bu yüzden "Lovelace, Ada" iki değil bir alandır. Tırnak içine alınmış bir alanın içindeki tırnaklar ikiye katlanır: "O ""selam"" dedi". Ve ayırıcının kendisi de değişir: ondalık virgüllü yerel ayarlardaki elektronik tablolar noktalı virgülle dışa aktarır ve sekmeyle ayrılmış dosyalar (TSV) veri hatlarında yaygındır. Karşılaştırmadan önce her iki dosyanın da aynı sınırlayıcıyı ve aynı tırnak kuralını kullandığından emin olun ya da RFC 4180'i izleyen bir ayrıştırıcıyla normalleştirin. Aksi takdirde diff, aynı verinin iki sürümünü değil, iki farklı lehçeyi karşılaştırıyor olur.

Dikkat edilmesi gereken yaygın tuzaklar

TuzakNeden can sıkarÇözüm
Uyuşmayan sınırlayıcılarVirgül vs. noktalı virgül her alanı farklı gösterirÖnce tek bir sınırlayıcıya normalleştirin
Başta BOMGizli bir bayt sırası işareti ilk başlık hücresini değiştirirKarşılaştırmadan önce BOM'u kaldırın
Baştaki sıfırlı ID'lerBir elektronik tablo 007'yi 7'ye dönüştürmüş olabilirID sütunlarını metin olarak tutun; dizgi olarak karşılaştırın
Gömülü satır sonlarıTırnak içine alınmış bir alan satır sonu içerebilir ve sonraki her satırı kaydırırSatır bölme değil, gerçek bir CSV ayrıştırıcı kullanın
Hücrelerde sondaki boşluklarGörünmez boşluklar bir değişiklik olarak görünürKarşılaştırmadan önce hücre değerlerini kırpın

Elektronik tablonun daha iyi araç olduğu durumlar

Bir metin diff'i hangi satırların değiştiğini belirlemek ve değişikliği veri olarak incelemek için mükemmeldir. Ancak binlerce satır boyunca filtrelemek, pivotlamak veya formülle karşılaştırmak gerekiyorsa, bir elektronik tablo daha uygundur: her iki dosyayı içe aktarın, anahtara göre hizalayın ve uyuşmazlıkları işaretlemek için bir arama kullanın. İki yaklaşım birbirini tamamlar. Hızlı görsel bir okuma için diff'i, verileri dilimlemeniz gerektiğinde elektronik tabloyu kullanın. Her iki durumda da temel biçimin kuralları için Wikipedia'nın CSV genel bakışı sağlam bir kaynaktır.

İlgili araçlar

CSV nadiren ele aldığınız tek biçimdir. Aynı veriler JSON olarak da bulunuyorsa, JSON karşılaştırma aynı fikri uygular. Bir değer sütunundaki yinelenenleri ayıklamak yinelenen satırları kaldır ile hızlıdır ve satırları bir diff'ten önce öngörülebilir bir sıraya koymak tam olarak satırları sırala'nın işidir.

Sıkça sorulan sorular

CSV dosyalarını online karşılaştırmak onları bir yere yükler mi?
comparetext.org'da diff tarayıcınızda çalışır. İki CSV dosyası kendi makinenizdeki JavaScript tarafından karşılaştırılır, bu yüzden açıkça Kaydet veya Paylaş'a tıklamadığınız sürece hiçbir şey sunucuya gönderilmez. Bu, müşteri dışa aktarımları, finansal veriler ve her tuş vuruşunda yükleme yapan bir siteye yapıştırmak istemeyeceğiniz diğer elektronik tablolar için güvenli kılar.
İki CSV dosyam neden her satırı farklı gösteriyor?
Neredeyse her zaman bu, gerçek değişiklikler değil, satır sırası ya da sınırlayıcıdır. Bir dışa aktarım diğerinden farklı sıralanmıştır ya da biri virgül diğeri noktalı virgül kullanır ya da satır sonları farklıdır. Her iki dosyanın da aynı sınırlayıcıyı kullandığından emin olun, ardından sıranın önemi kalmaması için her ikisini bir anahtar sütununa göre sıralayın. Bundan sonra diff genellikle gerçekten değişen birkaç satır ve hücreye iner.
İki CSV dosyasını satır sırasını göz ardı ederek nasıl karşılaştırırım?
Karşılaştırmadan önce her iki dosyayı da kararlı bir anahtar sütununa göre sıralayın. Satırların bir ID'si varsa ona göre sıralayın; aksi takdirde tüm satırı sıralayın. Başlık satırını yerinde tutun ve yalnızca veri satırlarını sıralayın. Tarayıcıda sıralanmış sürümleri yapıştırabilirsiniz; komut satırında dosyayı başlıktan sonra sıralayın. Her iki dosya da aynı sırada olduğunda, diff'te yalnızca gerçekten değişen satırlar görünür, sadece yer değiştiren her satır değil.
CSV'm neden virgül yerine noktalı virgül kullanıyor?
Birçok Avrupa yerel ayarı virgülü ondalık ayırıcı olarak kullanır, bu yüzden elektronik tablo uygulamaları belirsizlikten kaçınmak için CSV'yi noktalı virgül sınırlayıcısıyla dışa aktarır. Veriler aynıdır; yalnızca ayırıcı farklıdır. İki dosyayı karşılaştırmadan önce aynı sınırlayıcıyı kullandıklarından emin olun, yoksa her alanı değişmiş olarak işaretlenmiş görürsünüz. CSV'yi anlayan bir araçla her ikisini virgüle (ya da her ikisini noktalı virgüle) normalleştirmek bunu düzeltir. Sekmeyle ayrılmış dosyalarda farklı bir ayırıcıyla aynı sorun vardır.
Farklı sütun sıralarına sahip CSV dosyalarını nasıl karşılaştırırım?
Düz bir metin diff'i satırları soldan sağa karşılaştırır, bu yüzden veriler eşleşse bile yeniden sıralanmış sütunlar tümüyle bir değişiklik gibi görünür. Bunu ele almak için önce her iki dosyada sütunları eşleşecek şekilde yeniden sıralayın ya da konuma göre değil başlık adına göre karşılaştıran CSV'yi anlayan bir araç kullanın. csvkit gibi komut satırı araçları sütunları ada göre seçip yeniden sıralayabilir. Sütunlar aynı sırada hizalandığında, normal bir satır satır diff yeniden işe yarar.
Sayfa donmadan büyük CSV dosyalarını karşılaştırabilir miyim?
Evet, belli bir noktaya kadar. Satır modlu bir diff binlerce satırlı dosyalarda hızlı kalır çünkü her karakter yerine önce tüm satırları karşılaştırır. Çok büyük dosyalar (onlarca megabayt veya milyonlarca satır) verileri akış halinde işleyen csvkit gibi bir komut satırı aracı ya da bir veritabanı içe aktarımıyla daha iyi ele alınır. Bir tarayıcıda rahatça kaydırarak gezebileceğiniz bir dışa aktarım için online bir diff daha hızlı seçenektir.

Denemeye hazır mısınız? Dosyalarınızı CSV karşılaştırma aracına yapıştırın ve neyin değiştiğini görün.