Sınırlandırılmış dosyaları işlemenin en iyi yolu


16

Bu nedenle, genellikle bir CSV dosyası alan ve satır sınırlayıcıları olarak virgül ve dönüş karakteri kullanır.

Bu, her iki karakteri de içerebilen metinle ilgili belirgin sorunlara yol açar.

Açıkçası orada seçenekler var (kaçmak) ama insanlar bununla nasıl başa çıkıyor? Farklı karakterler mi kullanıyorsunuz - borular mı yoksa tildas mı? Onlardan kaçmak mı? Sınırlandırılmış dosyaları kullanmıyoruz, sonuçta 2010 ve şimdi XML var mı?

En azından sorunları görmemek için iyi bir şansa bakmak.

(Açıkça söylemek gerekirse, bu daha sağlam bir şeyden ziyade meraktan kaynaklanan bir sorudur - veriyle tekrar tekrar oynadığım, her zaman yuvarlaklaştım ama normalde biraz, iyi, kirli, ve diğer insanların deneyimlerinin ne olduğunu merak ettiler).


CSV kullanımı hakkında dikkatlice düşünün - başa çıkmak hoş ve kolaydır (yaygın kaçış kurallarının cevaplarına bakın), ancak olması gerektiği kadar çalışamaz - eğer sadece kendi programlarınızla iletişim kuruyorsanız sorun değil, Farklı programlar farklı kaçış kurallarına uyduğu için başka bir yere aktarmak biraz garipleşiyor.
Michael Kohne

@Michael - Kesinlikle. Sorun şu ki, her zaman çok cazip bir seçenek olduğunda neredeyse her zaman ortaya çıkacaksınız ve birçok eski sistemde tek seçenek bu.
Jon Hopkins

Olgun kütüphaneler, karakter sınırlamalı dosyaları okumak ve yazmak için birçok dilde (kesinlikle ortak olanlar) mevcuttur. Her türlü durumu ele alacaklar. Kendi CSV ayrıştırıcısını yazmak yaygın bir anti-desen türü gibi görünüyor.
quentin-starin

Yanıtlar:


13

Wikipedia'ya göre :

Yerleşik virgül içeren alanların çift tırnak işareti içine alınması gerekir.

Ve ayrıca:

Katıştırılmış çift tırnak karakterleri olan alanlar çift tırnak karakterleri içine alınmalı ve katıştırılmış çift tırnak karakterlerinin her biri bir çift tırnak işareti karakteriyle temsil edilmelidir.

Bunu kimin icat ettiğini bilmiyorum, ama sonunda kaçmak zorunda olduğunuzu etkili bir şekilde gösteriyor . Tek sağlam çözüm. Diğer her şey sadece koli bandının üstündeki koli bandıdır: belki şimdilik işe yarar, ancak sonunda bir istisna istisnası için bir istisnaya ihtiyaç duyduğunuz bir duruma çarpacaksınız ve kurallar topluluğunuzdan çok uzun sürmüyor basit bir kaçış karakteri çözümü olduğundan çok daha karmaşıktır.

Görünüşe göre CSV içerik oluşturucuları, ilk olarak virgüllerin kaydedilmesine izin veren çift tırnaklı özel sözdizimiyle gelip virgüllerden kaçınmaya çalıştılar, ancak birileri de çift tırnaklı karakterleri kaydetmek istedi, bu yüzden o noktada kaçmak zorunda kaldılar - kaçış karakteri olarak çift tırnak. İlk etapta düzgün bir şekilde kaçmaya karar verselerdi, sözdizimi şimdi daha kolay olurdu.


3
Ne olmalı, ve ne .. genellikle farklı :)
Tim Post

Bence çözüm gayet iyi. Basit veriler için, CSV iyi çalışır, karmaşık veriler için alıntı yapmak gereklidir ve "" ile "" izleri
BASIC'e

1
@Ernelli: Şimdi daha fazla düşündüğüme göre, aslında insan tarafından okunabilirlik ve basitlik arasında makul bir uzlaşma olabilir. Kaçan problem , bilgisayarın ayrıştırılması önemsiz olsa da, insanlara çirkin görünmesidir . Bu nedenle, yalnızca nadir durumlar için ayırma ("gömülü çift tırnak karakterleri olan alanlar") genellikle insan tarafından okunabilir görünen çıktılar üretir . Bu, alan adlarındaki virgüllerin alan adlarındaki çift tırnaklardan daha sık kullanıldığı varsayılarak iyi bir çözümdür.
Joonas Pulakka

2

Ben böyle bir şey var sanıyorum:

Foo,Baz,,,"Foo,Baz"

Sınırlayıcı içermemelidir dizeleri alıntı veya çıkışı yapılmaz ise, hiçbir var gerçek dosya ayrıştırma güvenilir yolu.

Bununla birlikte, verileri ayrıştırmak ve aşağıdaki gibi sonuçlar çıkarmak için inceleyebilirsiniz:

  • Virgülle ayrılmış şamandıralar dize olarak ele alınmalıdır
  • Bundan önceki veya sonraki satır daha az sınırlayıcı içeriyorsa, bu satırı ayrıştırmayı atlayın ve günlüğe kaydedin
  • 'Beğen'

Bunun gibi şeyleri işlemek için bir ayrıştırıcı yazmanız gerekir, ancak bunun karmaşık olması gerekmez.

Deneyimlerime göre, Excel gibi bir şeyden büyük dökümleri içe aktarmak her zaman geri dönüp bazı tuhaf topları gözden geçirmek zorunda kalıyor. Buradaki zorluk senin programı vermektir sadece çılgın bir ekleme yapmak kalmaması verileri ilgili yeteri kadar sağduyu. Sonra nelerin kaydedildiğini gözden geçirin ve yıkayın / durulayın / tekrarlayın.

Bir zamanlar tüm Ubuntu iş istasyonlarını kullanan küçük bir şirket için dahili bir SSS kullandım. SSS'nin bir kısmı 'kabuk kısayolları' verdi ve bana boru ile sınırlandı. Eh, cevapları (| şey yani grep foo) ve alıntı değil ya kaçtı da tipik boru ayrılmış bulundu. O acıyı hissediyorum :)


2

CSV ile bir noktaya kadar yanlış bir şey yok

CSV, biçimi değiştirmesi muhtemel olmayan ve alıcı ayrıştırıcısında pek çok sürpriz yaymayan katı olarak tanımlanmış veriler için iyi çalışır.

İşte büyük gotcha'ların kullanışlı bir listesi:

  1. "" Ler içinde "" çıkışından kaçılıyor (alan, alan sınırlayıcı içeriyor)
  2. "" ler CRLF'ler içeriyor (alan satır sınırlayıcı içeriyor)
  3. Unicode (temel metin biçimi yetersiz olabilir)
  4. Farklı işletim sistemleri için farklı hat sonlandırıcılar (CR veya CRLF veya LF veya NUL mu?)
  5. Satır içi yorumlar (satırın önüne #, //, -,; vb.)
  6. Sürüm yönetimi (dosyanın en son sürümü az ya da çok alan içeriyor)
  7. NULL ve boş veriler arasında ayrım ("", boş ama ,, null?)

Buna, alanların nasıl ayrıştırılması gerektiğini açıklayan bir meta veri üstbilgisi ile yaklaşabilirsiniz, ancak XML'i de kullanabilirsiniz. Bu tür serbest biçimli CSV karışıklığı nedeniyle icat edildi. XML yaklaşımı, yüzünde basit bir sorun olabilecek şey için çok ağır görünüyor.

Popüler bir alternatif "tuhaf karakter sınırlayıcı" stratejisidir. Bu gibi kaçan sorunların birçoğunu alır çünkü bir | alan sınırlaması için (boru) karakteri ve kayıt sonlandırma için bir CRLF. Bu, çok satırlı alan sorununu çözmez (alan sayacı kullanmadığınız sürece), ancak insanlar için güzel biçimlendirilmiş çizgiler elde edersiniz.

Genel olarak, bu tür bir dosyayı işlemenin basit bir yolunu arıyorsanız, Java dünyasında, OpenCSV'yi ona atabilirsiniz . Bu şekilde tüm sorunları yerleşik bir çerçeveye çekersiniz.


2

CSV birçok durumda hala geçerli bir biçimdir, özellikle de bir müşterinin uygulamanıza aktarılması gereken verileri yazmasının en kolay yolu olması gerektiğinden. Birkaç müşteri XML ile uğraşmayı sever, belki de çok ayrıntılı ve tüm bu "korkutucu" köşeli parantezlere sahiptir. Beyinlerini, üzerinde anlaşmaya varılan bir karakterle ayrılmış basit bir öğe listesi etrafına sarmak ve aynı alanın içeriğinde aynı karaktere izin verilmeyeceğini kabul etmek çok daha kolaydır.

Bununla birlikte, girdiyi doğru şekilde işlemeniz ve geçersiz karakterler kullandıkları durumları kontrol etmeniz gerekir. CSV ayrıştırma ihtiyaçlarım için FileHelpers kullanmaya başladım.


1

Ben her zaman standart sopa ve kaçmak. çoğu programlama dilinde iyi bir yerleşik destek veya iyi bir kütüphane mevcuttur.

hangi formatın kullanılacağına bağlıdır ve CSV basit veri formatı yapılarını değiştirmek için makul bir formattır.


0

CSV'yi unutun, JSON kullanın . Yazması kolay, ayrıştırması kolay. XML böyledir 2005 .


6
ve JSON biçiminin ({veya, gibi) bir karakterini kullanmak istediğinizde aynı sorunu
yaşıyor

Salandur: Hiç de değil! Kaçmak için kesin kurallar var! Ancak {ve, kaçmak bile gerekmez, çünkü içeride ip vardır, belirsiz değildirler!
user281377

1
Peki ve iyi, ama bir "JSON İhracat" özelliği olan excel hatırlamıyorum :) Sadece daha hoş bir formata almak için, garip şeyleri ayrıştırmak zorunda olduğunuz zamanlar vardır.
Tim Post

1
Ve JSON, aynı şekildeki bir milyon nesnenin etrafından geçmek için tamamen mükemmel. Bekle.
Frank Shearar

1
JSON, bu soru ile ilgili olarak CSV üzerinde herhangi bir gelişme sunmaz ve birçok uygulama ile birlikte çalışabilirlikten (belirtildiği gibi Office, SQL DB'ler vb. JSON dahili, hafif istemci tarafı işlemleri için mükemmeldir ancak XML, uygulamalar arasında veri aktarımı için çok daha iyidir.
Dan Diplo

0

Genellikle, kendimi yaptığım bir CSV dosyası yerine bir TSV (sekmeyle ayrılmış değerler) almak, dosyayı Emacs'a çekmek ve ASLA nadir bulunan birkaç karakterden hangisini kullandığını görmek ($ genellikle burada iyi bir seçimdir), ve sonra tüm sekmeleri $ 'a çeviriyorum.

Oradan, GNU AWK'ya $ 'ı alan ayırıcısı olarak kullanması söylenebilir ve Bob amcan.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.