Virgülle ayrılmış değer (CSV) dosyalarını düzenleme stratejisi


18

Veri analizi projelerinde çalıştığımda, verileri genellikle virgül veya sekmeyle ayrılmış (CSV, TSV) veri dosyalarında depolarım. Veriler genellikle özel bir veritabanı yönetim sistemine aittir. Birçok uygulamam için bu aşırı şeyler olurdu.

CSV ve TSV dosyalarını Excel'de (veya muhtemelen başka bir Elektronik Tablo programı) düzenleyebilirim. Bunun yararları vardır:

  • e-tablolar veri girmeyi kolaylaştırır

Ayrıca birkaç sorun var:

  • CSV ve TSV dosyalarıyla çalışmak, çeşitli özelliklerin kaybolması ve yalnızca etkin sayfanın nasıl kaydedileceği vb. Hakkında çok çeşitli uyarı mesajlarına yol açar. Bu nedenle, sadece dosyayı açmak ve küçük bir değişiklik yapmak istiyorsanız sinir bozucu.
  • Birçok "sözde akıllı" dönüşüm gerçekleştirir. Örneğin, 12/3 girerseniz, bir tarih girmek istediğinizi düşünür. GÜNCELLEME: Tarih örneğinin birçok örnekten sadece biri olduğunu söylemeliydim; sorunların çoğu uygunsuz dönüşümle ilgili gibi görünmektedir. Özellikle, sayılara veya tarihlere benzeyen metin alanları sorunlara neden olur.

Alternatif olarak, standart bir metin düzenleyicideki metin dosyasıyla doğrudan çalışabilirim. Bu girdiğim şeyin kaydedilen şey olmasını sağlar. Bununla birlikte, veri girmenin çok garip bir yoludur (sütunlar sıralanmaz; verileri birden çok hücreye girmek zordur vb.).

Soru

  • CSV veya TSV veri dosyalarıyla çalışmak için iyi bir strateji nedir? yani, hangi strateji verilerin girilmesini ve değiştirilmesini kolaylaştırırken, girdiğiniz şeyin doğru bir şekilde yorumlanmasını sağlar?

1
Dosyalar üzerinde gerçekten ne tür işlemler yapıyorsunuz? Aklımda, bu kabul edilebilir seçeneklerin yelpazesini önemli ölçüde etkiler. Ayrıca, bana göre, kelime işlemcinizde TSV verilerini düzenleyebilir ve sütunları korumak için sekmeleri sıralayabilirsiniz - kelime işlemciniz "akıllı" dönüşümler yapmayacak şekilde ayarlanabildiği ve düz metin olarak kaydedebildiği sürece, .
Wayne

@Wayne İyi bir nokta. Elektronik tablo programlarıyla büyüdüğüm için, tanıdığım birçok kısayol var (işlevler, kopyalama ve yapıştırma, fazladan bir sütun ekleme ve çok daha fazlası). Burada veri analizinden bahsetmiyorum, sadece basit bir tablo veri dosyası oluşturuyorum (örneğin, R kodumu işlemek için gereken bazı meta bilgiler). R'deki tüm bu temel tablo manipülasyonlarını yapabilmeme rağmen, benim için o kadar sezgisel değil. Muhtemelen zamanla, R'de bir csv açmak, birkaç küçük değişiklik yapmak ve tekrar kaydetmek tercih edilen seçenek haline gelecektir.
Jeromy Anglim

Yanıtlar:


14
  1. R konusunda rahatsanız, temel data.frame'inizi oluşturabilir ve ardından veri girmek için üzerindeki fix () işlevini kullanabilirsiniz. # 5 ile aynı satır boyunca, data.frame'i ayarladıktan sonra, verilerinizi almak, doğrulamak ve bir sonrakini ekleme fırsatı sağlamak için bir dizi readLines (n = 1) (veya her neyse) kullanabilirsiniz. kürek çekmek. Ardından sabitlemeyi () düzeltmek için bırakın. Aşağıdaki scan () yöntemini kullanarak uygulanan bir örneğe bakın.

  2. Excel'deki başka bir seçenek dağınık olabilir, ancak 12/9 yazabilir, ardından başka bir sütun değerlendirebilirsiniz = IFERROR (MONTH (DateEntryCell) / DAY (DataEntryCell), DataEntryCell). Ama sonra excel levha VE csv levha korumak gerekir ve csv yazarken tüm şikayet devam edecektir.

  3. Alternatif olarak, alanlarınız nispeten kısa ve tutarlı bir uzunluğa sahip olduğu sürece, normal bir metin düzenleyici TSV ile size iyi hizmet etmelidir. İşiniz bittiğinde her zaman excel'de yükleyebilir ve her satır için sütun sayısının beklediğiniz gibi olduğundan emin olabilirsiniz.
  4. Emacs birkaç platformda mevcuttur ve muhtemelen bunun için bir şey vardır, örneğin http://www.emacswiki.org/emacs/CsvMode .
  5. Eğer doyurucu bir ruhsanız, veri girişini yapmak için bir programlama dilinde hızlı bir şey programlamak önemsizdir, veri düzenleme çok daha zor olacaktır.
  6. Hızlı bir google araması sadece bu amaçla yazılım gösterir, ancak hiçbir özgür yazılım iyi görünmüyordu.
  7. Kulağa çılgınca geliyor, ancak süper kullanıcılardan biri erişimde tabloları düzenlemeyi ve daha sonra bunları CSV olarak dışa aktarmayı önerdi ... bu sadece çalışmak için yeterince çılgın.
  8. Excel'in .csv olarak kaydettiğinizde şikayet etmesini durdurmaz, ancak veri giriş alanınızdan önce tek bir kesme işareti yazabilirsiniz ve bu da onu otomatik biçimlendirme açısından tek başına bırakır. Güzel, bu (en azından Office 2007'de) csv dosyasında kesme işaretleri bırakmaz.

Güncelleme: Bu sorunla ilgili çok şey söylüyorum çünkü bu benim de bir sorunum. Şimdiye kadar gördüğüm veri girişi için en iyi / en kolay çözüm KillinkCSV . "Ücretsiz" yazılım değil, 30 günlük deneme süresi ve makul bir fiyat (~ 27 $) ile shareware. Mevcut CSV'leri düzenlemek için ne kadar güvendiğime emin değilim - inanılmaz derecede büyük (ve muhtemelen iyi biçimlendirilmiş) bir CSV verdim ve tüm satırları okuyamadı. Ancak makul büyük (20 MB) biri için iyi çalışıyor gibi görünüyordu ve büyük dosya ile ilgili sorun benim tarafımda kullanıcı hatası olabilir.

R Örneği:

#This function takes a what argument like in scan, 
#a list with the types to be used, see usage example 
#at the end of this code block
#dataEntry will keep reading in values until 
#the values it reads in matches what is in 
#"terminateon".
#limitations: Many
dataEntry <- function(what,terminateon)
{
  CONTINUE <- TRUE #Make sure we start the loop
  data <- NULL #Create empty data so that the data.frame can define itself
  ti <- NULL
  while(CONTINUE)
  {
    ti <- NULL    
    ti <- tryCatch(
      {as.data.frame(scan(what=what, nlines=1, multi.line=FALSE, comment.char="",quiet=TRUE))},
      error=function (e) {print("Error in data entry! Line not stored.")
                          return(NULL)},
      warning=function(w) {print("Error in data entry! Line not stored.")
                           return(NULL)},
      finally={ti <- NULL}
    ) #Try getting the data according to the parameters in 'what' one row at a time.
    if (!is.null(ti))
    {
      if ((ncol(ti)==length(what)) & (nrow(ti)==1)) {
        data <- rbind(data,ti) #If there wasn't an error, add ti to the previous value  
      } else {
        print("Too many or not enough values on previous entry.")
        print("Tail of current data:")
        print(tail(data))
      }
    }
    if (!is.null(ti) & all(ti == terminateon)) 
    {
      CONTINUE <- FALSE
      data <- data[-c(nrow(data)),]
    } #if we've recieved the final value we won't continue and the last row is invalid so we remove it
  }
  return(data)
}

dataEntry(list(x=integer(), y=numeric(), z=character()),terminateon=c(999,999,"Z"))

Evet, ve Debian / Ubuntu - neat'daki paket csv-mode.elsayesinde zaten kurduğum ortaya çıkıyor emacs-goodies-el.
Dirk Eddelbuettel

1
+1, 1. nokta için şimdiye kadar çalıştığım tüm stat yazılımları (R, Stata, SPSS ve SAS dışında) bu tür işlevsellik sağlar. Bu nedenle tavsiyeniz, birisinin çalışmak istediği yazılım hakkında genelleme yapar.
Andy W

5

Güncelleme: [R-Yardım gelen e-posta büyük bir birikmiş işler geçiyor] Ben " davranışread.csv() " konuyu hatırlattı . Bu bağlamda Duncan Murdoch, Veri Değişim Biçimi'ni (DIF) kullanmayı tercih ettiğini belirtiyor Jeromy'nin bazı nedenlerinden ötürü csv yerine dosyalarını belirtiyor. Sadece denedim ve Gnumeric yanlış anlıyor (tarih olarak 12/3 yükleniyor), ancak OpenOffice.org bunu doğru okuyor ve 12/3 bilgilerini koruyor. (MS Excel'de bunu kontrol etmek isteyen var mı?)

DIF dosyaları düz metindir ve e-tablolar tarafından okunabilir ve (son bir R revizyonunu kullandığınız sürece (SVN revizyonu> = r53778)) verileri doğru biçimde okuyacaktır.


orijinal : Mümkün olduğunda veri düzenleme / düzenleme için bir elektronik tablo tam durağı kullanmaktan kaçınmaya çalışacağım. Mevcut bir veri kümesinde yaptığınız herhangi bir değişikliği yeniden üretilebilir bir araştırma bakış açısından dışarıda bırakacak şekilde belgelemek imkansız olmasa bile inanılmaz derecede zordur. En çok, mevcut verileri hızlı bir şekilde görüntülemek için bir e-tablo kullanıyorum.

Veri işleme için, ham csv dosyasını alacak ve gerekli tüm işlem adımlarını uygulayacak bir R komut dosyası yazma eğilimindeyim. Her senaryoda tam olarak ne yaptığımı ve nedenini açıklamak için bu senaryoyu ağır bir şekilde yorumluyorum. Veri analizi komut dosyam daha sonra verileri yükleyen ve işleyen veri işleme komut dosyasını çağırır.

Veri girişi için, verileri bir metin düzenleyicisine veya bir e-tabloya girmek daha mı zor? İkincisi için bahsettiğiniz sorunların, bir metin düzenleyiciye CSV verilerini girmeye çalışanlardan daha ağır basmadığından şüpheleniyorum.

Daha iyi bir e-tablo deneyebilirsiniz; OpenOffice.org, sütunu önce "sayısal" olarak biçimlendirse bile, 12/3 biçimini tarih olarak durdurmayı (veya sayısal gösterime dönüştürmeyi) reddeder. Olduğu gibi diğer taraftan Gnumeric 12/3 bırakacaktır eğer ilk "sayısal" olarak sütununu biçimlendirmek.

Girişlere a ekleyerek OpenOffice.org'u tarih olarak 12/3'ü yeniden biçimlendirmemeye zorlayabilirsiniz ', yani '12/3e-tabloda 12/3 olarak görüntülenecek ve metin olarak kaydedilecektir. Bu muhtemelen oldukça güvenlidir.

Metin dosyasında neden 12/3'ün sayısal olarak 12/3 olarak depolanmasını istediğinizden emin değilsiniz - R gibi bir şey bunu nasıl okumalı?

Özelliklerin kaybolması veya yalnızca etkin sayfanın kaydedilmesi ile ilgili uyarılar hakkındaki yorumunuz gerçekten sorun değil mi? (Eğer öyleyse, o zaman hayatımda senin problemlerini istiyorum ;-)


Tekrarlanabilir araştırma ile ilgili olarak, eğer dosya formatı CSV ise, CSV dosyası değişiklikler yapıldığında kolayca sürüm kontrolü altına alınabilir. Bu tekrarlanabilir araştırmalar için yeterli midir? Veri girişi ile ilgili olarak, verimliliği en üst düzeye çıkarmak için sık sık başkalarının sabit genişlik formatında ham veri girişi yapmasını veya yapmasını sağlarım; ancak verileri CSV veya TSV'de depolamayı tercih ediyorum (daha şeffaf buluyorum); sütunu sayısal olarak biçimlendirmeyle ilgili. bu bilgiler muhtemelen tasarrufta kaybolacaktır.
Jeromy Anglim

12/3 ile ilgili olarak, bunun 12'yi 3'e bölüştüğü çoktan seçmeli bir test örneğim vardı. Ancak, bunu daha açıklayıcı bir örnek olarak kullanıyorum. Büyük bir CSV dosyam olduğunda, uygun olmayan tek bir dönüşüm bile istemiyorum. Uyarılarla ilgili olarak, CSV dosyalarını günde 10 kez açarsam uyarılar sıkıcı olur. Ayrıca aslında CSV dosyasını kaydedip kaydetmediğimi daha az netleştiriyorlar. Rant için özür dilerim.
Jeromy Anglim

@ Evet, evet, hemen kaydettiğiniz ve taahhüt ettiğiniz tek bir değişiklik (veya tek veri işleme adımı) yapmak konusunda katı olsaydınız. Ben bir komut dosyası kullanarak R (tercih ettiğim dil olduğu gibi) işleme yapmak hakkında bir not eklemek istemiyordu. Veri meslektaşlarımın bana gönderdiği şekilde çalışıyorum; Bir elektronik tabloya hızlı bir şekilde bakabilirim, sonra csv'yi R'ye okuyabilir ve uygulamam gereken tüm veri işleme adımlarını içeren bir komut dosyası yazabilirim. Daha sonra bu komut dosyasını yorumladım, böylece ne yaptığımı ve neden yaptığımı kaydettim ve orijinal veri dosyasını hiç değiştirmedim.
Monica'yı eski durumuna getirin - G. Simpson

@Jeromy: uyarılarda adil bir nokta. Uzun zamandan beri onları gürültü olarak filtreledim, bu yüzden beni rahatsız etmiyorlar. Sadece Gnumeric ve OpenOffice.org'u test ettim ve 12/3 ile bir csv'yi otomatik olarak tarihlere dönüştürdüler - bu çöp! Ne demek istediğini anlıyorum. Bunu durdurmanın tek yolu, bu verileri metin olarak depolamak ve veri türünü yükleme / içe aktarmaya zorlamak olacaktır.
Monica'yı eski durumuna getirin - G. Simpson

@Jeromy: re: sayısal biçimlendirmeyi kaybetme - evet, sütun türünü içe aktarma sırasında (OpenOffice.org) içinde "sayısal" (Gnumeric) veya "metin" olarak belirtmediğiniz sürece olur. Dönüşümden kaçınmak için metin olarak saklamak daha iyi olabilir (düzenlediğim cevaba bakın) - yine de içe aktarma sırasında veri türünü belirtmeniz gerekecek ...
Monica'yı eski

3

Google rafine'ye (http://code.google.com/p/google-refine/) bakmanızı öneririm. Bence CSV dosyalarını düzenlemek için çok iyi bir araç


Bunun sorudaki strateji talebine nasıl yanıt verdiğini açıklayabilir misiniz ?
whuber

3

CSV ve TSV dosyalarıyla birlikte çalışmaktan kaçınırım. Bunun yerine SQL kullanmayı öğrenin ve sadece verilerinizin bir datamart veya veritabanı (DB) kopyası üzerinde çalışın veya veritabanınıza geçiş bağlantısı olan SAS veya R'yi kullanabilirsiniz. Bu şekilde, Excel'de (veya kullandığınız herhangi bir elektronik tablo programını) korkunç bir bulma ve değiştirme yapmak veya hatalara eğilimli olabilecek kopyalama ve yapıştırma yapmak yerine verilerinizde toplu güncellemeler yapabilirsiniz. Bir DB sistemi kullanmanın avantajı, yanlışlıkla yapıldıysa ve tüm değişiklikler denetlenebiliyorsa, günlüğe kaydetmeyi ve hızlı bir şekilde geri alma değişikliklerini etkinleştirebilmenizdir. Ayrıca, değişkenleri / sütunu uygunsuz bulduğunuz şekilde yanlışlıkla güncellememenizi veya değiştirmemenizi sağlamak için DB tablolarınıza bütünlük kısıtlamaları yerleştirilebilir (örneğin tarihler tarih olarak kalır ve diğer bilgiler uygun şekilde yazılır). Kazandım'

Veri girişlerinizi bir şekilde sağladığı için e-tabloları seviyorsanız, veritabanlarıyla birlikte gelen grafik kullanıcı arabirimi araçlarını / IDE'leri (örneğin Microsoft'un Yönetim Stüdyosu) kullanarak veya bağlantılı bir sürümü çekerek kullandığım her veritabanında aşılabilir. veritabanınızı, verilerinizi girmek ve veri kısıtlamalarını zorlamak için özel olarak tasarlanmış bir sistemde (ör. Access'teki bağlantılı tablo formları veya özel bir web arayüzü). Ayrıca, her iki dünyadan en iyi şekilde yararlanmanıza ve verileri Excel'de güncellemenize ve bu değişikliklerin veritabanınıza yayılmasına izin verecek diğer programları da kullanabilirsiniz (bkz. Https://www.youtube.com/watch?v=5iyuF_mDSac ) .


2

Bu soruyu sorduktan sonra CSVed'e bakmaya başladım .

Web sitesinden:

CSVed kolay ve güçlü bir CSV dosya editörüdür, herhangi bir ayırıcı ile ayrılmış herhangi bir CSV dosyasını işleyebilirsiniz.

Kimsenin onunla deneyimi olup olmadığından emin değilim.


Yüklemeyi denedim. Hızlı bir denemeden sonra veri girişi için çöp gibi görünüyordu; belki daha uzun süre deneseydim, nasıl etkili bir şekilde kullanılacağını anlayabilirdim, ama sanmıyorum.
russellpierce

Bunun sorudaki strateji talebine nasıl yanıt verdiğini açıklayabilir misiniz ?
whuber

2

Excel çok CSV dostu değildir. Örneğin, Excel'e "1,300" girip virgülle ayrılmış bir değer olarak kaydederseniz, bu size izin verir! Bu büyük bir sorun olabilir (başkalarından dosya alırken düzenli olarak karşılaşıyorum).

Şahsen OpenOffice.org Calc kullanıyorum, yukarıda listelenen çözümlerin çoğunu da kullanıyorum, ancak bunların çoğunda düzenli düzenleme için gerekli işlevsellik ve kullanım kolaylığı yok. OOO Calc, Excel'den çok daha akıllıdır, ancak bir elektronik tablo programı olmasına rağmen, "12/3" yerine "= 12/3" girmeniz gerekir, aksi takdirde hesaplama yerine bir değer girersiniz.

Bir koşuşturma verin, hayal kırıklığına uğramayacaksınız.


1

Gnumeric'i seviyorum, çünkü diğerleri gibi o kadar salak dayanıklı olmaya çalışmıyor (kayıp işlevsellik hakkında bağırmıyor) ve büyük verilerle çalışıyor ... ama sadece Linux olduğunu düşünüyorum.


1
Bir Windows sürümü var: Bu soru şu, bir avı yaptım projects.gnome.org/gnumeric/downloads.shtml
Jeromy Anglim

1
yalnızca geçerli sayfayı kaydetme konusunda uyarır (Jeromy'nin hata ayılarından biri) ve içe aktarmada sayısal olduklarını manuel olarak belirtmedikçe düzgün şekilde kaydedilmiş 12/3 sayısalları tarihlere dönüştürme rahatsız edici özelliğine sahiptir (Veri> Get Dış Veri> Metin Dosyasını İçe Aktar ...) yüklenmiyor.
Monica'yı eski durumuna getirin - G. Simpson

Bunun sorudaki strateji talebine nasıl yanıt verdiğini açıklayabilir misiniz ?
whuber

1

Sadece kullanmak Ron Editör . 'Yardım' olmadan Excel gibi.

Siteden:

Ron's Editor güçlü bir sekmeli metin veya CSV editörüdür. Standart virgül ve sekmeyle ayrılmış dosyalar (CSV ve TSV) dahil olmak üzere herhangi bir ayrılmış metin biçimini açabilir ve içerik ve yapıları üzerinde tam denetime izin verir.

Sekmeli metin dosyaları düzenlenebilir, aynı zamanda kolayca analiz edilebilir ve gerektiğinde ekstra görünümde özetlenebilir, böylece güçlü analiz işlevselliği eklenir.

  • Lisans: Kişisel kullanım / değerlendirme için ücretsiz
  • Çalışır: Windows 32/64-bit 2000 / XP / 2003 / Vista /

Bunun sorudaki strateji talebine nasıl yanıt verdiğini açıklayabilir misiniz ?
whuber

1

Ben şahsen CSV dosyalarını yönetmek için "ilişkisel veritabanı" fikrini kullanmak istiyorum. CSV dosyaları veri alışverişi için iyidir, ancak iş mantığı içermez. CSV ile çalışma deneyimim, "analizi geliştirmek için iş dünyasında birçok iterasyon var". Yalnızca düz metin dosyalarıyla (CSV) çalışmak birçok zorluğa neden olacaktır. Örneğin, CSV dosyası "verileri benzersiz kılan şeyleri", yani "her satıra birincil anahtar" ı göstermez. Bu, daha sonra katılacak başka veri kaynağımız olduğunda büyük sorunlara neden olacaktır.

SQLite , CSV'yi ilişkisel veritabanına dönüştürmek için iyi bir araçtır ve CSV'ye benzer şekilde, değiştirilmesi kolaydır ve sunucu kurulumu gerekmez. Daha da önemlisi,R diğer istatistiksel yazılımlarda ve .

Stratejim her zaman ilişkisel veritabanında "temizlenmiş veri" sağlamaktır. Ve her tablonun birincil anahtarında açık tutun.

İşte gerçek kelimede neler olabileceğine bir örnek (varsayalım ki kitap satıyoruz):

  • 1. Gün, tüm müşteri bilgilerini içeren bir CSV dosyası aldım.
  • 2. Gün, tüm ürün (kitap) bilgilerini içeren başka bir CSV dosyası aldım.Bazı nedenlerden dolayı, işletme ISBN'nin mevcut olmadığını ve kitap adı ile yazar adı kombinasyonu birincil anahtar olduğunu söyledi.
  • 3. Gün, İşletme, kitap sürümünün dikkate alınması gerektiğini, gün2'nin CSV'sini "üzerine yazmak" için başka bir CSV gönderdiler.
  • 4. Gün, İş bulundu müşteri bilgileri güncellenebilir (adres değişikliği gibi), müşteri bilgilerinin güncellenmiş bir sürümünü gönderirler.

Artık temiz verilerin avantajını görebilir ve bunları ilişkisel veritabanında tutabilirsiniz. Birincil anahtar olarak müşteri kimliğini ve birincil anahtar olarak kitap adını, yazarı ve sürümü yazın. Veri güncellemeleri yapmak ve gerektiğinde değişiklikleri dahil etmek çok kolaydır. Ayrıca birincil anahtar yeni gelen veriler için "kısıtlamalar" ve "akıl sağlığı kontrolü" sağlar.


0

Excel'in "Verileri İçe Aktar" özelliğini kullanırsanız, her sütun için veri türünü seçme seçeneği sunar. Tüm sütunları seçebilir ve "Metin" veri türünü kullanabilirsiniz.


Bunun sorudaki strateji talebine nasıl yanıt verdiğini açıklayabilir misiniz ?
whuber
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.