Strategia edycji plików z wartościami oddzielonymi przecinkami (CSV)

18

Podczas pracy nad projektami analizy danych często przechowuję dane w plikach danych rozdzielanych przecinkami lub tabulatorami (CSV, TSV). Podczas gdy dane często należą do dedykowanego systemu zarządzania bazą danych. W przypadku wielu moich aplikacji byłoby to przesadzanie.

Mogę edytować pliki CSV i TSV w programie Excel (lub prawdopodobnie innym programie do obsługi arkuszy kalkulacyjnych). Ma to zalety:

  • arkusze kalkulacyjne ułatwiają wprowadzanie danych

Istnieje również kilka problemów:

  • Praca z plikami CSV i TSV prowadzi do wielu komunikatów ostrzegawczych o utracie różnych funkcji oraz o tym, jak tylko aktywny arkusz zostanie zapisany i tak dalej. Dlatego denerwujące jest, jeśli chcesz tylko otworzyć plik i dokonać drobnych zmian.
  • Dokonuje wielu „rzekomo inteligentnych” konwersji. Na przykład, jeśli wpiszesz 12/3, pomyślisz, że chcesz wprowadzić datę. AKTUALIZACJA: Powinienem wspomnieć, że przykład daty jest tylko jednym z wielu przykładów; większość problemów wydaje się być związana z niewłaściwą konwersją. W szczególności pola tekstowe wyglądające jak liczby lub daty powodują problemy.

Alternatywnie mogłem pracować bezpośrednio z plikiem tekstowym w standardowym edytorze tekstu. To gwarantuje, że to, co wpisuję, jest rejestrowane. Jest to jednak bardzo niewygodny sposób wprowadzania danych (kolumny się nie układają; trudno jest wprowadzić dane po prostu do wielu komórek; itp.).

Pytanie

  • Jaka jest dobra strategia pracy z plikami danych CSV lub TSV? tj. jaka strategia ułatwia wprowadzanie danych i manipulowanie nimi, a jednocześnie zapewnia, że ​​wprowadzane dane są właściwie interpretowane?
Jeromy Anglim
źródło
1
Jakie operacje faktycznie wykonujesz na plikach? Moim zdaniem ma to ogromny wpływ na zakres dopuszczalnych opcji. Wydaje mi się również, że możesz edytować dane TSV w edytorze tekstu i zakładki w kolejce, aby zachować kolumny - o ile twój edytor tekstu może być ustawiony tak, aby nie wykonywać „inteligentnych” konwersji i może zapisywać jako zwykły tekst, który wielu może .
Wayne,
@Wayne Dobry punkt. Ponieważ dorastałem z programami do arkuszy kalkulacyjnych, znam wiele skrótów, które znam (funkcje, kopiowanie i wklejanie, dodawanie dodatkowej kolumny i wiele więcej). Uwaga: nie mówię tu o analizie danych, ale po prostu utworzeniu prostego pliku danych tabelarycznych (np. Niektóre meta informacje potrzebne do przetworzenia mojego kodu R). Chociaż mogłem wykonywać wszystkie te podstawowe operacje na stole w R, nie jest to dla mnie tak intuicyjne. Prawdopodobnie z czasem otwarcie csv w R, wprowadzenie kilku drobnych zmian i zapisanie go ponownie stanie się moją preferowaną opcją.
Jeromy Anglim,

Odpowiedzi:

14
  1. Jeśli nie masz doświadczenia z R, możesz utworzyć podstawową ramkę data.frame, a następnie użyć funkcji fix () do wprowadzenia danych. Wzdłuż tego samego wiersza co # 5, po skonfigurowaniu data.frame możesz użyć szeregu readLines (n = 1) (lub cokolwiek innego), aby uzyskać dane, zweryfikować je i zapewnić możliwość dodania następnego rząd. Następnie pozostaw poprawkę do fix (). Zobacz zaimplementowany przykład poniżej za pomocą scan ().

  2. Inna opcja w programie Excel byłaby niechlujna, ale można wpisać 12/9, a następnie poprosić o ocenę innej kolumny = IFERROR (MONTH (DateEntryCell) / DAY (DataEntryCell), DataEntryCell). Ale wtedy będziesz musiał zachować arkusz Excela i arkusz csv, a wszystkie narzekające podczas pisania csv pozostaną.

  3. Alternatywnie, o ile pola są stosunkowo krótkie i mają stałą długość, zwykły edytor tekstowy powinien dobrze obsługiwać TSV. Zawsze możesz załadować go w programie Excel, gdy skończysz i upewnić się, że liczba kolumn dla każdego wiersza jest zgodna z oczekiwaniami.
  4. Emacs jest dostępny na wielu platformach i prawdopodobnie ma coś właśnie w tym celu, np . Http://www.emacswiki.org/emacs/CsvMode .
  5. Jeśli jesteś serdeczną duszą, zaprogramowanie czegoś szybkiego w języku programowania do wprowadzania danych jest banalne, edycja danych będzie o wiele trudniejsza.
  6. Szybkie wyszukiwanie w Google pokazuje oprogramowanie przeznaczone tylko do tego celu, ale żadne wolne oprogramowanie nie wydaje się być dobre.
  7. To brzmi szalenie, ale ktoś z superużytkownika zasugerował, aby edytować tabele w dostępie, a następnie wyeksportować je jako CSV ... to jest po prostu szalone do pracy.
  8. Nie przestaje się skarżyć programowi Excel, gdy zapisujesz jako .csv, ale możesz wpisać pojedynczy apostrof przed polem wprowadzania danych, co sprawia, że ​​pozostawiasz to samo pod względem automatycznego formatowania. Cóż, to (przynajmniej w pakiecie Office 2007) nie pozostawia apostrofów w pliku csv.

Aktualizacja: Dużo zastanawiałem się nad tym problemem, ponieważ mam problem. Jak dotąd najlepszym / najłatwiejszym rozwiązaniem do wprowadzania danych, jakie do tej pory widziałem, jest KillinkCSV . To nie jest „darmowe” oprogramowanie, to shareware z 30-dniowym okresem próbnym i rozsądną ceną (~ 27 USD). Nie jestem jednak pewien, jak bardzo ufam przy edycji istniejących plików CSV - podałem mu niesamowicie duży (i przypuszczalnie dobrze sformatowany) plik CSV i nie udało się odczytać wszystkich wierszy. Wydawało się jednak, że działa dobrze dla takiego, który był dość duży (20 MB), a problemem z większym plikiem może być błąd użytkownika z mojej strony.

R Przykład:

#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"))
russellpierce
źródło
Tak, i okazuje się, że już csv-mode.elzainstalowałem dzięki emacs-goodies-elpakietowi w Debian / Ubuntu - neat.
Dirk Eddelbuettel,
1
+1, dla punktu nr 1 całe oprogramowanie statystyczne, w jakim kiedykolwiek pracowałem (oprócz R, Stata, SPSS i SAS) zapewnia takie funkcje. Twoje porady uogólniają się na oprogramowanie, z którym ktoś chce pracować.
Andy W
5

Aktualizacja: [Przejrzałem dużą liczbę zaległych wiadomości e-mail z R-Help] Przypomina mi się wątek „ Zachowanie sięread.csv() ”. W tym Duncan Murdoch wspomina, że ​​woli używać plików DIF (Data Interchange Format) zamiast csv z jakiegoś powodu, dla którego Jeromy wspomina. Właśnie próbowałem tego i Gnumeric robi to źle (ładowanie 12/3 jako daty), ale OpenOffice.org czyta to poprawnie i zachowuje nietknięte informacje 12/3. (Czy ktoś chce to sprawdzić w MS Excel?)

Pliki DIF są zwykłym tekstem i mogą być odczytywane przez arkusze kalkulacyjne, a R (o ile korzystasz z ostatniej wersji R (wersja SVN> = r53778)) odczyta dane we właściwym formacie.


Oryginalny : w miarę możliwości starałbym się unikać używania kropki w arkuszu kalkulacyjnym do edycji / manipulacji danymi. Niezwykle trudne, jeśli nie niemożliwe, jest udokumentowanie wszelkich zmian, które wprowadzasz w istniejącym zbiorze danych, tak że praktycznie wyklucza to z odtwarzalnego punktu widzenia badania. Co najwyżej używam arkusza kalkulacyjnego, aby szybko przeglądać istniejące dane.

Do przetwarzania danych zwykle piszę skrypt R, który pobierze surowy plik csv i zastosuje wszystkie niezbędne wymagane kroki przetwarzania. Mocno komentuję ten skrypt, aby dokładnie wyjaśnić, co robię na każdym etapie i dlaczego. Mój skrypt analizy danych wywołałby następnie skrypt przetwarzania danych, który ładuje i przetwarza dane.

Czy w przypadku wprowadzania danych trudniej jest wprowadzić dane w edytorze tekstu lub w arkuszu kalkulacyjnym? Podejrzewam, że problemy, o których wspomniałeś w przypadku tych ostatnich, nie przeważają nad próbami wprowadzenia danych CSV do edytora tekstu.

Możesz wypróbować lepszy arkusz kalkulacyjny; OpenOffice.org odmawia zatrzymania formatowania 12/3 jako daty (lub konwertuje ją na reprezentację numeryczną), nawet jeśli najpierw sformatuje się kolumnę jako „numeryczną”. Gnumeric natomiast pozostawi 12/3, jak to jest , czy sformatować kolumnę jako „numeryczny” pierwszy.

Możesz zmusić OpenOffice.org, aby nie formatował 12/3 jako daty, przygotowując a 'do wpisów, tzn. '12/3Zostanie wyświetlony jako 12/3 w arkuszu kalkulacyjnym i zapisany jako tekst. Jest to prawdopodobnie dość bezpieczny w użyciu.

Nie jestem pewien, dlaczego chcesz, aby 12/3 było przechowywane liczbowo jako 12/3 w pliku tekstowym - jak coś takiego jak R powinien to przeczytać?

Twój komentarz do ostrzeżeń o utracie funkcji lub zapisaniu tylko aktywnego arkusza nie jest tak naprawdę problemem, prawda? (Jeśli tak, to chcę waszych problemów w moim życiu ;-)

Przywróć Monikę - G. Simpson
źródło
Jeśli chodzi o odtwarzalne badania, jeśli format pliku to CSV, plik CSV można łatwo poddać kontroli wersji z zatwierdzeniami po wprowadzeniu zmian. Czy to wystarczyłoby do powtarzalnych badań? Jeśli chodzi o wprowadzanie danych, często robię lub zlecam innym wprowadzanie surowych danych w formacie o stałej szerokości, aby zmaksymalizować wydajność; jednak wolę przechowywać dane w CSV lub TSV (uważam, że są bardziej przejrzyste); w odniesieniu do formatowania kolumny jako liczbowej. informacje te prawdopodobnie zostałyby utracone podczas oszczędzania.
Jeromy Anglim,
jeśli chodzi o 12/3, miałem przykład testu wielokrotnego wyboru, w którym reprezentowało to 12 podzielone przez 3. Jednak używam go raczej jako ilustracyjnego przykładu. Kiedy mam duży plik CSV, nie chcę nawet jednej niewłaściwej konwersji. W odniesieniu do ostrzeżeń, jeśli otwieram pliki CSV 10 razy dziennie, ostrzeżenia stają się nużące. Sprawiają również, że mniej jasne jest, czy rzeczywiście zapisałem plik CSV, czy nie. Przepraszam za rant.
Jeromy Anglim,
@Jeromy tak, byłoby, gdybyś był ściśle związany z dokonaniem jednej zmiany (lub pojedynczego kroku przetwarzania danych), którą natychmiast zapisujesz i zatwierdzasz. Mam na myśli, aby nie dołączać uwagi na temat przetwarzania w języku R (ponieważ jest to mój preferowany język) za pomocą skryptu. Tak pracuję z danymi wysyłanymi mi przez kolegów; Mogę rzucić okiem na arkusz kalkulacyjny, a następnie przeczytać csv do R i napisać skrypt, który zawiera wszystkie kroki przetwarzania danych, które muszę zastosować. Następnie komentuję ten skrypt, więc mam zapis tego, co zrobiłem i dlaczego to zrobiłem, i nie zmieniłem wcale oryginalnego pliku danych.
Przywróć Monikę - G. Simpson,
@Jeromy: sprawiedliwy punkt na ostrzeżenia. Już dawno odfiltrowałem je jako hałas, żeby mi nie przeszkadzały. Właśnie przetestowałem Gnumeric i OpenOffice.org, a one zautomatyzowały konwersję pliku csv z 12/3 na daty - to śmieci! Więc rozumiem, co masz na myśli. Jedynym sposobem na zatrzymanie tego byłoby zapisanie tych danych jako tekstu i wymuszenie tego typu danych podczas ładowania / importowania.
Przywróć Monikę - G. Simpson,
@Jeromy: re: utrata formatowania numerycznego - tak, chyba że określisz typ kolumny jako „numeryczny” (Gnumeric) lub „tekst” w (OpenOffice.org) podczas importu. Lepiej może być przechowywać go jako tekst (patrz moja zredagowana odpowiedź), aby uniknąć konwersji - nadal musisz określić typ danych podczas importu ...
Przywróć Monikę - G. Simpson,
3

Sugeruję, aby spojrzeć na Google Refine (http://code.google.com/p/google-refine/). Myślę, że to bardzo dobre narzędzie do edycji plików CSV


źródło
Czy możesz wyjaśnić, w jaki sposób odpowiada to na prośbę o strategię w pytaniu?
whuber
3

Unikałbym wspólnej pracy z plikami CSV i TSV. Zamiast tego naucz się korzystać z SQL i operować tylko kopią danych lub kopią danych (DB) swoich danych lub możesz używać SAS lub R z połączeniem passthru z bazą danych. W ten sposób możesz dokonywać zbiorczych aktualizacji swoich danych zamiast strasznego wyszukiwania i zastępowania w Excelu (lub dowolnym programie arkusza kalkulacyjnego, którego używasz) lub kopiowania i wklejania, które mogą być podatne na błędy. Zaletą korzystania z systemu DB jest także to, że można włączyć rejestrowanie i szybkie przywracanie wprowadzonych zmian, jeśli są one błędne, a wszystkie zmiany mogą być kontrolowane. Ponadto ograniczenia dotyczące integralności mogą być nakładane na tabele DB, aby zapewnić, że nie pomyłkowo zaktualizujesz lub zmienisz zmienne / kolumnę w sposób, który uważasz za nieodpowiedni (np. Daty pozostają jako daty, a inne informacje są odpowiednio rzutowane). Wygrałem'

Jeśli lubisz arkusze kalkulacyjne, ponieważ w jakiś sposób umożliwia ono wprowadzanie danych, można to pokonać w każdej bazie danych, z której kiedykolwiek korzystałem, korzystając z narzędzi graficznego interfejsu użytkownika / IDE dostarczanych z bazami danych (np. Microsoft Management Studio) lub pobierając wersję połączoną bazy danych do systemu zaprojektowanego specjalnie do wprowadzania danych i egzekwowania ograniczeń danych (np. formularze połączonych tabel w programie Access lub niestandardowy interfejs WWW). Możesz także użyć innych programów, które pozwolą ci uzyskać to, co najlepsze z obu światów i zaktualizować dane w programie Excel, a zmiany te zostaną propagowane do Twojej bazy danych (patrz na przykład https://www.youtube.com/watch?v=5iyuF_mDSac ) .

StatsStudent
źródło
2

Po zadaniu tego pytania zacząłem patrzeć na CSVed .

Ze strony:

CSVed jest łatwym i wydajnym edytorem plików CSV, możesz manipulować dowolnym plikiem CSV, oddzielonym dowolnym separatorem.

Nie jestem pewien, czy ktoś ma z tym doświadczenie.

Jeromy Anglim
źródło
Próbowałem go zainstalować. Po szybkiej próbie wydawało się, że są to śmieci do wprowadzania danych; może gdybym spróbował dłużej, byłbym w stanie dowiedzieć się, jak skutecznie go używać, ale nie podejrzewam.
russellpierce
Czy możesz wyjaśnić, w jaki sposób odpowiada to na prośbę o strategię w pytaniu?
whuber
2

Excel nie jest bardzo przyjazny dla CSV. Na przykład, jeśli wprowadzisz „1300” do Excela i zapiszesz go jako wartość oddzieloną przecinkami, pozwoli ci to! To może być duży problem (spotykam się z nim regularnie, gdy otrzymuję pliki od innych).

Osobiście korzystam z OpenOffice.org Calc, korzystam również z wielu wyżej wymienionych rozwiązań, jednak wiele z nich nie ma funkcji i łatwości użycia, które są wymagane do regularnej edycji. OOO Calc jest o wiele bardziej inteligentny niż Excel, chociaż będąc programem arkusza kalkulacyjnego, nadal będziesz musiał wpisać „= 12/3” zamiast „12/3”, w przeciwnym razie będziesz wprowadzać wartość, a nie obliczenia.

Daj mu wir, nie zawiedziesz się.

Adam
źródło
1

Lubię Gnumeric, ponieważ nie próbuje być tak odporny na idioty jak inni (nie krzyczy o utraconej funkcjonalności) i działa z dużymi danymi ... ale myślę, że to tylko Linux.


źródło
1
po tym pytaniu zrobiłem polowanie: istnieje wersja systemu Windows projects.gnome.org/gnumeric/downloads.shtml
Jeromy Anglim
1
ostrzega jednak przed zapisaniem tylko bieżącego arkusza (który był jednym z niedźwiedzi Jeromy'ego) i ma irytującą funkcję konwertowania poprawnie zapisanych liczb 12/3 na daty, chyba że ręcznie określisz, że są numeryczne podczas importu (Dane> Pobierz Dane zewnętrzne> Importuj plik tekstowy ...) nie ładują się.
Przywróć Monikę - G. Simpson,
Czy możesz wyjaśnić, w jaki sposób odpowiada to na prośbę o strategię w pytaniu?
whuber
1

Wystarczy użyć edytora Rona . Jest tak jak Excel bez „pomocy”.

Ze strony:

Redaktor Rona to potężny edytor tabelaryczny lub CSV. Może otwierać dowolny format oddzielonego tekstu, w tym standardowe pliki rozdzielane przecinkami i tabulatorami (CSV i TSV), i umożliwia całkowitą kontrolę nad ich zawartością i strukturą.

Nie tylko można edytować tabelaryczne pliki tekstowe, ale można je również łatwo filtrować i podsumowywać w dowolnej liczbie dodatkowych widoków, co jest wymagane, dodając potężne funkcje analizy.

  • Licencja: bezpłatny do użytku osobistego / oceny
  • Działa na: Windows 32/64-bit 2000 / XP / 2003 / Vista /
Aaron Stewart
źródło
Czy możesz wyjaśnić, w jaki sposób odpowiada to na prośbę o strategię w pytaniu?
whuber
1

Osobiście lubię używać „relacyjnej bazy danych” do zarządzania plikami CSV. Pliki CSV są dobre do wymiany danych, ale nie zawierają logiki biznesowej. Moje doświadczenie w pracy z CSV polega na tym, że „istnieje wiele iteracji z biznesem w celu dopracowania analizy”. Praca tylko z plikami zwykłego tekstu (CSV) będzie stanowić wiele wyzwań. Na przykład plik CSV nie pokaże „co sprawia, że ​​dane są unikalne”, tj. Jaki jest „klucz podstawowy do każdego wiersza”. Spowoduje to później duże problemy, gdy będziemy mieli inne źródło danych do przyłączenia.

SQLite jest dobrym narzędziem do przekształcenia CSV w relacyjną bazę danych i podobnie jak CSV, jest łatwy do wymiany i nie wymaga konfiguracji serwera. Co ważniejsze, bardzo dobrze wspierał Ri inne oprogramowanie statystyczne.

Moją strategią jest zawsze utrzymywanie „oczyszczonych danych” w relacyjnej bazie danych. I wyraźnie zaznacz klucz podstawowy każdej tabeli.

Oto przykład tego, co może się wydarzyć w rzeczywistości (załóżmy, że sprzedajemy książki):

  • Dzień 1 otrzymałem plik CSV zawierający wszystkie informacje o kliencie.
  • Dzień 2 otrzymałem kolejny plik CSV zawierający wszystkie informacje o produkcie (książce). Z jakiegoś powodu firma stwierdziła, że ​​nie ma dostępnego numeru ISBN, a kombinacja nazwy książki i nazwiska autora jest kluczem podstawowym.
  • Dzień 3, wydanie książki znalezionej w biznesie musi zostać rozliczone, wysyłają kolejny plik CSV, aby „zastąpić” plik CSV dnia 2.
  • Dzień 4, informacje o klientach znalezionych w firmie mogą być aktualizowane (np. Zmiana adresu), wysyłają zaktualizowaną wersję informacji o klientach.

Teraz możesz zobaczyć zaletę czystych danych i przechowywać je w relacyjnej bazie danych. Z powiedzmy identyfikator klienta jako klucz podstawowy, a nazwa książki, autor i wydanie jako klucz podstawowy. Aktualizowanie danych i wprowadzanie zmian w razie potrzeby jest bardzo łatwe. Również klucz podstawowy daje również „ograniczenia” i „kontrolę poczytalności” dla nowych nadchodzących danych.

Haitao Du
źródło
0

Jeśli używasz funkcji Excel „Importuj dane”, daje ona możliwość wyboru typu danych dla każdej kolumny. Możesz wybrać wszystkie kolumny i użyć typu danych „Tekst”.

okrągły kwadrat
źródło
Czy możesz wyjaśnić, w jaki sposób odpowiada to na prośbę o strategię w pytaniu?
Whuber