İ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.
| Diff'te gördüğünüz | Gerçek bir değişiklik mi? | Ne yapmalı |
|---|---|---|
| Farklı sıradaki satırlar | Hayır, veriler aynı kümeyse | Her iki dosyayı bir anahtar sütununa göre sıralayın |
| Virgül vs. noktalı virgül sınırlayıcı | Hayır, aynı alanlar | Tek 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ır | Satır sonlarını normalleştirin |
| Sondaki boş bir satır | Hayır | Kırpın |
| Bir hücre değeri değişti | Evet | İ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öntem | En uygun olduğu durum | Çaba | CSV'yi anlar mı? |
|---|---|---|---|
| Gözle bakmak | Çok küçük dosyalar, birkaç satır | Düşük | Hayır, ayrıştırıcı sizsiniz |
| Online diff aracı | Hızlı kontroller, her yerden yapıştırma | Düşük | Satır satır, evet |
| Elektronik tablo uygulaması | Görsel inceleme, formüller, filtreleme | Orta | Evet, ama manuel |
Komut satırı (sort, csvkit) | Büyük dosyalar, betikleme, anahtarlı karşılaştırmalar | Orta | Evet, ö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.
- 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.
- Satır sırası önemli değilse, her iki dosyayı önce bir anahtar sütununa göre sıralayın.
- CSV karşılaştırma aracını açın.
- Orijinali sola, yeni sürümü sağa yapıştırın.
- 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:
| Satır (id'ye göre) | Sütun | Öncesi | Sonrası | Değişiklik |
|---|---|---|---|---|
| 7 | role | editor | admin | Değiştirildi |
| 7 | seats | 3 | 5 | Değiştirildi |
| 8 | — | — | — | Değ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
| Tuzak | Neden can sıkar | Çözüm |
|---|---|---|
| Uyuşmayan sınırlayıcılar | Virgül vs. noktalı virgül her alanı farklı gösterir | Önce tek bir sınırlayıcıya normalleştirin |
| Başta BOM | Gizli bir bayt sırası işareti ilk başlık hücresini değiştirir | Karşılaştırmadan önce BOM'u kaldırın |
| Baştaki sıfırlı ID'ler | Bir elektronik tablo 007'yi 7'ye dönüştürmüş olabilir | ID 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ır | Satır bölme değil, gerçek bir CSV ayrıştırıcı kullanın |
| Hücrelerde sondaki boşluklar | Görünmez boşluklar bir değişiklik olarak görünür | Karşı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.