Bir Dosya CSV Başlıkları Autodetect'in varlığı

4 Cevap php

Short question: otomatik olarak nasıl bir CSV dosyası ilk satırda başlıkları olup olmadığını tespit ediyorsunuz?

Detay: I (yaklaşık) bir bellek veri tabanı olarak erişebilir bir nesnenin içine veri yerleştirir küçük bir CSV ayrıştırma motoru yazdık. Orijinal kod öngörülebilir bir format ile üçüncü parti CSV ayrıştırmak için yazılmıştı, ama daha genel olarak bu kodu kullanmak için muktedir istiyorum.

Ben otomatik olarak CSV başlıkların varlığını tespit etmek için güvenilir bir yol anlamaya çalışıyorum, bu yüzden komut tuşları / sütun adları olarak CSV dosyasının ilk satırını kullanabilirsiniz ya da hemen veri ayrıştırma başlatmak için karar verebilirsiniz. Ben gereken her bir mantıksal bir test olduğundan, kolayca CSV kendimi dosyasını inceledikten sonra bir argüman belirtmek olabilir, ama ben daha ziyade (otomasyon go go) için olurdu değil.

Ben ilk 3 ayrıştırmak gerekiyor hayal? CSV satırları dosya ve başlıklarına karşı karşılaştırmak için bazı tür bir desen arayın. Ben üç özellikle kötü durumlarda kabuslar görüyorum:

  1. Başlıklar nedense sayısal verileri içerir
  2. Ilk birkaç satır (veya CSV büyük kısımları) null
  3. Orada başlıkları ve veri ayrı anlatmak çok benzer

Ben bir "en iyi tahmin" almak ve ayrıştırıcı bir hata ile başarısız ya da karar olamaz eğer bir uyarı tükürmek olabilir, bu tamam. Bu mutlulukla fikir hurda ve geri "önemli şeyler" üzerinde çalışmaya gideceğim zaman ya da hesaplama açısından son derece pahalı olması (ve beni kurtarmak için gerekenden daha fazla zaman alır) için gidiyor bir şey varsa.

PHP ile çalışıyorum, ama bu uygulama özel bir şeye daha bir algoritmik / hesaplama soru daha beni vurur. Basit bir algoritma varsa ben, büyük kullanabilirsiniz. Eğer bazı ilgili teori / tartışmaya beni işaret edebilir, bu çok büyük olurdu. Doğal dil işleme ve çözümleme 300 farklı türde yapan dev bir kütüphane varsa, ben ilgilenmiyorum.

4 Cevap

Diğerleri işaret gibi,% 100 güvenilirlik ile bunu yapamaz. Bunu 'çok doğru' oluyor, ancak yararlı olduğu durumlar vardır - örneğin, CSV işlevselliği ile elektronik tablo araçları genellikle kendi üzerinde bu anlamaya çalışın. Burada ilk satırı isn't bir başlık belirtmek için eğiliminde olacaktır birkaç sezgiselleri bulunuyor:

  • Ilk satır dizeleri olmayan veya boş sütun var
  • İlk satırın sütunları tüm benzersiz değildir
  • Ilk satır tarih ve diğer ortak veri formatları içeren görünür (örneğin, xx-xx-xx)

In the most general sense, this is impossible. This is a valid csv file:
Name
Jim
Tom
Bill

Most csv readers will just take hasHeader as an option, and allow you to pass in your own header if you want. Even in the case you think you can detect, that being character headers and numeric data, you can run into a catastrophic failure. What if your column is a list of BMW series?
M
3
5
7

Siz bu yanlış işleyecektir. Hepsinden kötüsü, sen iyi araba kaybedersiniz!

"Ben onlara da hakkında hiçbir şey biliyorsanız nasıl dataâ datab ayırt etmeyin": aşağı kaynar beri tamamen soyut anlamda, ben sorunuzun bir şaşmaz algoritmik cevap olduğunu sanmıyorum. Dataâ datab ayırt olması için her zaman potansiyel var olacaktır. O dedi, ben basit ile başlar ve gerektiğinde sadece karmaşıklığını eklersiniz. Örneğin, 2-5 hepsi aynı ama satır 1 veri türü farklı satırlarda veri türü, bir başlık satırı (mevcut olduğunu iyi bir şans varsa, belirli bir sütun (veya sütunlar) için, ilk beş satır inceleyerek artmış örnek boyutları) hata olasılığını azaltır. Satırları tüm doldurulan ama veri çağıran program yanında ne karar sağlamak için ayırt edilemez ise, belki bir istisna - Bu (sorta) # 1 / # 3. çözecek. # 2 için, null olmayan verileri çeker sürece, sadece bir satır olarak bir satır sayılmaz ki .... (Eğer EOF vurmak istiyorum hangi durumda) boş bir dosya ama çalışacak. Bu kusursuz asla, ama "yeterince yakın" olabilir.

Gerçekten sizin aracı olmak istiyorum ne kadar "genel" bağlıdır. Veriler her zaman sayısal olacaksa, sen sürece sayısal olmayan başlıkları (oldukça adil bir varsayım gibi görünüyor) varsaymak kolay o var.

Zaten desen verileri mevcut ne bilmiyorum ama bunun ötesinde, o zaman gerçekten vaktinden onlar için test edemez.

FWIW, aslında sadece hepsi aynı kaynaktan, TSVs bazı şeyler dışında ayrıştırma için bir senaryo yazdı. Başlıkları / biçimlendirmeye kaynağının yaklaşımı bu yüzden sadece yürütülürken komut bana komut satırından soru sormak yapmak mantıklı olduğunu dağınık. (Bu bir başlık var mı? Sütunlar önemli hangileridir?). Yani hiçbir otomasyon, ama o beni her yerine komik biçimlendirme davayı öngörmeye çalışıyor ben çalışıyorum veri setleri aracılığıyla savurdular. Ayrıca, benim cevaplar bir dosyaya kaydedilir, bu yüzden sadece dosya başına bir kere dahil olmak zorunda. İdeal, ama verimli değildir.