Bu makaleyi okuyordum ve bu sorunun doğru cevabını merak ediyorum.
Aklıma gelen tek şey, belki de bazı ülkelerde ondalık ayırıcının virgül olmasıdır ve CSV'de veri paylaşırken sorun olabilir , ancak cevabımdan gerçekten emin değilim.
Bu makaleyi okuyordum ve bu sorunun doğru cevabını merak ediyorum.
Aklıma gelen tek şey, belki de bazı ülkelerde ondalık ayırıcının virgül olmasıdır ve CSV'de veri paylaşırken sorun olabilir , ancak cevabımdan gerçekten emin değilim.
Yanıtlar:
CSV format özelliği RFC 4180'de tanımlanmıştır . Bu özellik yayınlandı çünkü
CSV dosyalarının çok çeşitli yorumlarına izin veren, resmi bir şartname bulunmamaktadır.
Ne yazık ki, 2005'ten beri (RFC'nin yayınlanma tarihi) hiçbir şey değişmedi. Hala çok çeşitli uygulamalarımız var. RFC 4180'de tanımlanan genel yaklaşım, virgül gibi karakterleri tırnak içine alan alanları içine almaktır, ancak bu öneri her zaman farklı yazılımlar tarafından karşılanmamaktadır.
Sorun, çeşitli Avrupa bölgelerinde virgül karakterinin ondalık sayı olarak işlev görmesidir, bu yüzden 0,005
bunun yerine yazarsınız 0.005
. Yine de diğer durumlarda, basamak gruplarını işaret etmek için boşluk yerine virgül kullanılır, örneğin 4,000,000.00
( buraya bakın ). Her iki durumda da virgül kullanmak, muhtemelen csv dosyalarından veri okumada hatalara yol açar, çünkü yazılımınız 0,005, 0,1
iki sayı mı yoksa dört farklı sayı mı olduğunu gerçekten bilmez ( buradaki örneğe bakın ).
Son olarak, en az değil, metni metin dosyanızda saklarsanız, o zaman virgüller metinde, örneğin noktalı virgüllerden daha yaygındır; bu nedenle, metniniz tırnak içine alınmazsa, bu tür verilerin kolayca hatalarla okunabilmesi için .
Hiçbir şey virgüllerin daha iyi olmasını veya CSV dosyalarının yukarıda açıklanan sorunlara karşı koruma sağlayan RFC 4180'in tavsiyelerine uygun olarak kullanıldığı kadarıyla alan ayırıcılarını daha iyi hale getiremez. Bununla birlikte, alanları tırnak işaretleri içine almayan basitleştirilmiş CSV formatını kullanma riski varsa veya öneri tutarsız bir şekilde kullanılabilirse, diğer ayırıcılar (örneğin noktalı virgül) daha güvenli bir yaklaşım gibi görünmektedir.
,
nadir bir ayırıcı yerine kullanılmasının argümanı verileri engellediği için her zaman kaçmak zorunda olduğunuz için doğrudur. Ve tabii ki, CSV'nin nasıl çalıştığını bildiklerini ama gerçekten işe yaramadığını sanan insanlar var.
Teknik olarak virgül, ayırıcı olarak kullanılacak herhangi bir karakter kadar iyidir. Biçimin adı doğrudan değerlerin virgülle ayrıldığını belirtir (Virgülle Ayrılmış Değerler).
CSV formatının açıklaması ayırıcı olarak virgül kullanıyor.
Virgül içeren herhangi bir alan çift alıntı yapılmalıdır. Bu, verileri okumak için sorun yaratmaz. Açıklamadaki 6. maddeye bakınız :
- Satır kesmeleri (CRLF), çift tırnak işaretleri ve virgüller içeren alanlar çift tırnak işaretleri içine alınmalıdır.
Örneğin, işlevler read.csv
ve write.csv
R'den varsayılan olarak ayırıcı olarak virgül kullanıyorlar.
values
virgülle ayrılmış olduğu anlamına gelir . formatting
Sayıları avrupalı isteyen diğerleri standard
, yukarıdaki 6. maddeyi doğru bir şekilde belirttiğiniz gibi, bu csv için bir sorun değildir . "Doğru kullanım" dan sapmalar herhangi bir veri formatıyla mevcuttur. Mesele şu ki - verilerinizi bilin. Diğerleri bahsetti tab
veya ;
sınırlandırdı, ancak bunlar kullanıcı tarafından girilen verilerle uğraşırken virgüllerle aynı sorunlara sahip olabilir (belki bir form aracılığıyla ve bir veritabanıyla ele geçirilmiş olarak - insanların girdiği serbest metin giriş alanlarıyla uğraşmak zorunda kaldım) yağ parmaklı tab
... içinde berbat) var
Rakamlarla rakam ayırıcı olmasının yanı sıra, birçok ülkede adresin (müşteri adresi vb. Gibi) bir parçasını oluşturur. Bazı ülkelerde kısa iyi tanımlanmış adreslere sahip olmakla birlikte, diğerlerinde, aynı satırda iki virgül de dahil olmak üzere uzun sarma adresleri vardır. İyi CSV dosyaları, tüm bu verileri çift tırnak içine alır. Fakat aşırı basit, kötü yazılmış ortaklar, okuma ve farklılaştırma için yeterli değildir. (O zaman, şiirden alıntı gibi verilerin bir parçası olarak çift tırnak kullanma problemi vardır).
@Tim in cevabı doğru olsa da - bir bütün olarak "csv" nin ortak bir standardı olmadığını, özellikle kaçan kuralların tanımlanmadığını, bir programda okunabilen, ancak bir programda okunabilen "formatlara" yol açtığını eklemek isterim. . Bu, güneşin altındaki her "programcı" nın "oooh csv - düşündüğümde" kendi ayrıştırıcımı yapacağım! ve sonra tüm kenar durumlarda özlüyor.
Dahası, csv, meta verileri ve hatta bir sütunun veri türünü saklama yeteneğinden tamamen yoksundur - bu, verileri anlamak için okumanız gereken bazı belgelere yol açar.
Virgül sınırlayıcıyı çıkarabilir ve bir sekme karakteri kullanabilirseniz çok daha iyi bir başarı elde edersiniz. .CSV isimli dosyayı bırakabilirsiniz ve çoğu programa içeri aktarmak genellikle bir sorun değildir. Dosyanızı içe aktarırken virgül yerine TAB ile sınırlandırılmış olarak belirtin. Verilerinizde virgül varsa, bildiğiniz gibi virgül belirtilirken bir probleminiz olacak.
|
Evde yayınlanmış csv benzeri metin dosyalarında (kitap başlıkları ve diğer belge meta verilerinde) sınırlayıcı olarak iyi sonuçlar elde ettim . |
Çalıştığım verilerde asla ortaya çıkmaz, bu yüzden herhangi bir alıntı yapmak için kontrol etmeden basitçe bölünen / birleştirilen perl komut dosyaları yazabilirim. Bu, yalnızca MS Access veritabanından kaydedilen meta verilerin işlenmesini içeren tek seferlik bir proje içindi. Daha büyük projeler için veya bu dosya biçiminde uzun süre veri saklamayı planlıyorsanız, daha sağlam bir şey seçin! Bu ayki parti bir şeyleri kırarsa her zaman bir şeyleri değiştirebilirim.
split
Stata için bir komut yazdığımda , diğerlerinin yanı sıra, ne yaptığını ve ne yapmadığını görmek için Perl eşdeğerine baktım. Kaynak kod değil, sadece sunulan işlevsellik.
cut
, sort
ve uniq
.
ASCII bize ascii (7) * nix man sayfasından bir snippet'te gösterildiği gibi dört "ayırıcı" karakter sağlar:
Oct Dec Hex Char
----------------------
034 28 1C FS (file separator)
035 29 1D GS (group separator)
036 30 1E RS (record separator)
037 31 1F US (unit separator)
Bu cevap , kullanım amaçlarına iyi bir genel bakış sağlar.
Elbette, bu kontrol kodları daha popüler sınırlayıcıların insan dostu (okunabilirlik ve girdi) lerinden yoksundur, ancak programlar arasında dahili ve / veya geçici veri alışverişi için kabul edilebilir seçimlerdir.
Sorun virgül değil; sorun alıntı. Hangi kayıt ve alan sınırlayıcıları kullandığınıza bakılmaksızın, içerikle tanışmak için hazırlıklı olmanız gerekir. Bu yüzden bir alıntı mekanizmasına ihtiyacınız var. VE SONRA, alıntı karakter (ler) inin görünmesi için bir yola ihtiyacınız var.
RFC 4180 standardına uymak her şeyi herkes için kolaylaştırır.
Şahsen bunu yanlış yapan bir programın çıktısını düzeltmek için bir senaryo yazmam gerekti, bu yüzden biraz militanım. "muhtemelen düzeltme", MY verilerim için çalıştığı anlamına gelir, ancak başarısız olacağı durumları görebilirim. (Bu programın savunmasında standarttan önce yazılmıştır.)