Csv dosyasını doğrulamak nasıl?

6 Cevap php

Nasıl bir CSV dosyası doğrulayabilir?

Ben yapısının bir CSV dosyası var:

Date;Id;Shown
15-Mar-10;231;345
15-Mar-10;232;346
and so on and on !!! approx around 80,000 rows. 

Nasıl kullanarak ayrıştırma başlamadan önce bu CSV dosyasını doğrulamak fgetcsv?

6 Cevap

Ben elden önce dosyayı doğrulamak için deneyin olmaz: Ben oldukça ayrı ayrı her hattı ile uğraşan, satır satır geçiyor tercih ederim:

  • Bir satır Okuma
  • Tamam doğrulanıyor
  • verileri kullanılarak
  • ve sonraki satıra gidiyoruz.


Now, what could "verify it's OK" means ?

  • En azından: - Ben okur benim işlevi ile bir satır okuyamıyor eğer, zaten ben fonksiyonları projeme (maybe fgetcsv, belki başka bir işlevi belirli benim normal seti ile, CSV olarak satır okumak emin olun yüzlerce, bir sorun o satırda var çünkü) muhtemelen
  • Sonra, alanların sayısını kontrol
  • then, for each field, check if it contains "valid" data
    • zorunlu? optionnal?
    • Sayısal?
    • dize?
    • tarih?
    • ve benzeri
  • then, for each field, some more careful checks
    • Örneğin, bir "kod" alanı için: benim uygulama için yasal bir değere tekabül ediyor?

If all that goes OK -- well, not much more to do, excepts use the data ;-)
And when you're done with one line, just go repeat for the next one.


Of course, if you want to either accept or reject a whole file before doing any database (or anything like that) write, you'll have to :

  • "verifying" fikirleri uygulayarak, satır dosya, satır ayrıştırmak
  • bellekte her satırın verileri depolamak
  • and, when the whole file has been read to memory,
    • either start verileri kullanılarak
    • ya da, tek bir satırda bir hata olmuştur eğer, her şeyi reddetmek.


In your specific case, you have three kind of fields :

Date;Id;Shown
15-Mar-10;231;345
15-Mar-10;232;346

Sanırım ne Gönderen:

  • The first one must be a date
    • Doğrulamak için bazı regex kullanarak kolay olmayacak: gün aynı sayıda gün aynı sayıda yıl bağlı olarak Şubat orada değil, birçok ay var, her ay yok ...
    • Böyle bir durumda, muhtemelen gibi bir şey ile tarih ayrıştırmak denemek istiyorum strtotime (not sure it's ok for the format you're using, though)
    • Or I would just explode the string
      • Emin üç parça vardır yapma
      • Üçüncü bir 2 basamak olduğunu
      • İkinci bir Jan biri olduğu, Feb, Mar, ...
      • İlki iki başkalarına bağlı olarak, gün doğru sayıya karşılık geldiğini
  • The second one :
    • bir tamsayı olmalıdır
    • must be a valid value, that exists in your database ?
      • Eğer öyleyse, basit bir SQL sorgusu bu kontrol sağlayacak
  • For the third one, not really sure...
    • Ben bir tamsayı olmak zorunda tahmin ediyorum?

Sen hemen sonra okuma için gidiyoruz eğer bunu doğrulayarak olmak istemiyorum. Sadece okudum ve okumak gibi herhangi bir hata yakalamak.

I http://pypi.python.org/pypi/cutplace/ edinilebilir gibi dosyaların doğrulama basitleştirmek için bir açık kaynak Python aracı yazdı.

Temel fikir OpenOffice.org, Excel veya düz CSV kullanarak yapılandırılmış bir arayüz şartnamede veri biçimini tarif olmasıdır. Bu birkaç dakika ve çok dokümantasyon olarak hizmet verecek kadar okunaklı yapılır. Biz günlük bazında yaklaşık 200.000 satır ile dosyaları doğrulamak için kullanabilirsiniz.

Siz komut satırını kullanarak bir CSV dosyasını doğrulamak:

cutplace specification.csv data.csv

Geçersiz veri satırları bulunduğu durumda, çıkış kodu 1'dir. Daha fazla kontrol gerekiyorsa, cutplace modülü ithalat ve doğrulama olayları için bir dinleyici ekler küçük bir Python komut dosyası yazabilirsiniz.

Örnek olarak, burada birkaç varsayımlar yaparak kısa bir açıklama boşlukları doldurarak, sağlanan örnek verileri doğrulamak olacak bir şartname var. (Ben bu yazı bunu inline CSV şartname yazıyorum. Uygulamada tercihim OpenOffice.org 'un Kireç ve ODS daha fazla biçimlendirme kullanmak ve daha kolay okumak ve korumak için yapabilir çünkü.)

,"Interface: Show statistics"
,
,"Data format"
"D","Format","CSV"
"D","Item delimiter",";"
"D","Header","1"
"D","Encoding","ASCII"
,
,"Fields"
,"Name","Example","Empty","Length","Type","Rule"
"F","date","15-Mar-10",,,"RegEx","\d\d-[A-Z][a-z][a-z]-\d\d"
"F","id","231",,,"Integer","0:"
"F","shown","345",,,"Integer","0:"
,
,"Checks"
,"Description","Type","Rule"
"C","id per date must be unique","IsUnique","date, id"

"D" ile başlayan satırlar temel veri biçimi açıklanmaktadır. Bu durumda kullanarak bir CSV dosyası ";" ASCII kodlaması 1 başlık hattı ile sınırlayıcı olarak.

"F" ile başlayan satırlar çeşitli alanları açıklamaktadır. Örneğin,

,"Name","Example","Empty","Length","Type","Rule"
"F","id","231",,,"Integer","0:"

0 veya daha büyük bir değere sahip tip Integer zorunlu alan "id" tanımlar. Alan boş izin vermek için, "Boş" sütununda "X" belirtin:

,"Name","Example","Empty","Length","Type","Rule"
"F","id","231","X",,"Integer","0:"

Sonunda tek satır değil sadece, tüm dosya yumurtlama daha gelişmeler kontrollerini içeren isteğe bağlı bir bölüm var. Dosyanızda her tarih sadece bir kez bir kimliği için tarih vermesi gerekir Örneğin, kullandığınız bu ifade edebiliriz:

,"Description","Type","Rule"
"C","id per date must be unique","IsUnique","date, id"

Boş bir sütun ile başlayan herhangi bir satır gibi ve doğrulama sırasında işlenen olmayacak herhangi bir metin içerebilir. Bu böylece başlıklar, yorumlar ve için yararlıdır.

Bir hata oluşursa giriş doğrulamak gerek yok, FALSE dönecektir.

Maç (ve dolayısıyla yok olanları bayrak) satırları bulmak için normal bir ifade kullanılmış olabilir. this link bakabilirsiniz. Söyleniyor, bunu sadece aracılığıyla bunu ilk defa ayrıştırmak için çalışıyor ve herhangi bir hata yakalamak kapalı muhtemelen daha iyi bunu doğrulamak için tüm dosyayı okumak gerekir.

Okuduğunuz veriler geçerlidir bekliyoruz, ve sadece geçersiz görünüyor veya beklenmedik bir biçimi olan satırları görmezden.

CSV veri alışverişi için ya da bir veri depolama olarak kullanılır. Bu yüzden dosyaların oluşturulduğu zaman “valid” zaten çok olasıdır. Eğer - her ne sebeple - kullanıcı girişi (geçersiz veya beklenmeyen veri gelebilir tek gerçek kaynağı) gibi bir CSV dosyası var, bu verileri görmezden gelerek ve geçersiz çizgileri hakkında kullanıcıyı söylüyorum hiçbir sorun yoktur.