Prosty, niezawodny, otwarty i interoperacyjny format zwykłego tekstu do przechowywania danych

17

W poprzednim pytaniu poprosiłem o narzędzia do edycji plików CSV .

Gavin powiązał z komentarzem R Help autorstwa Duncana Murdocha sugerującym, że Data Interchange Format to bardziej niezawodny sposób przechowywania danych niż CSV.

W przypadku niektórych aplikacji potrzebny jest dedykowany system zarządzania bazą danych. Jednakże, w przypadku projektów małych analizy danych skala czegoś więcej waga wydaje się bardziej odpowiedni.

Pod uwagę następujące kryteria oceny format pliku:

  • reliabile : wprowadzone dane powinny pozostać wiernym temu, co zostało wprowadzone; dane powinny być otwierane konsekwentnie w innym oprogramowaniu;
  • prosty : byłoby miło, jeśli format pliku jest łatwe do zrozumienia i być idealnie czytelne pomocą edytora prosty tekst; napisanie prostego programu do odczytu i zapisu formatu powinno być łatwe.
  • open : format powinien być otwarty
  • interoperacyjny : format pliku powinien być obsługiwany przez wiele systemów

Uważam, że formaty wartości rozdzielanych tabulatorami i przecinkami nie spełniają kryterium wiarygodności. Chociaż przypuszczam, że mógłbym winić za to programy importujące i eksportujące, a nie format pliku. I często znajduję się konieczności dokonywania małych korekt w opcji read.tablew celu zapobieżenia jakąś dziwną postać z przerywając ładowanie ramki danych.

pytania

  • Który format pliku najlepiej spełnia te potrzeby?
  • Czy Data Interchange Format jest lepszą alternatywą? czy ma własne problemy?
  • Czy jest jakiś inny preferowany format?
  • Czy niesprawiedliwie oceniam TSV i CSV? Czy istnieje prosty zestaw wskazówek dotyczących pracy z takimi plikami, które zwiększają niezawodność formatu pliku?
Jeromy Anglim
źródło
2
Dodam, R nie mają write.DIF()więc jest trochę jednokierunkowej ulicy obawiam.
Przywróć Monikę - G. Simpson,
1
Nie rozumiem kwestii csv i niezawodności. Czy to znaczy, że nie jest ścisłe CSV wystarczy? Ścisłe oznacza, że ​​gdyby przepisy dotyczące csv były wystarczająco rygorystyczne, każde narzędzie zgodne z tymi definicjami mogłoby załadować plik bez potrzeby stosowania dodatkowych parametrów.
steffen,
@steffen Mam na myśli takie rzeczy: ładowanie i zapisywanie pliku csv w niektórych programach zmienia plik csv; ładowanie plików csv może spowodować niewłaściwą konwersję, chyba że będziesz ostrożny; Pliki csv czasem się psują, gdy dodawane są dziwne kombinacje znaków bez właściwego ucieczki. Być może mylę używanie csv z samym formatem, chociaż słyszałem, jak ludzie komentują brak oficjalnego standardu. Oczywiście zdaję sobie sprawę, że w wielu przypadkach działa dobrze.
Jeromy Anglim
5
@steffen: CSV nie przechowuje żadnych informacji o formacie ani typach danych przechowywanych w pliku. Możesz również otworzyć plik CSV w dwóch różnych aplikacjach i pozwolić mu interpretować dane w pliku na dwa różne sposoby.
Przywróć Monikę - G. Simpson,
1
@JeromyAnglim, myślę, że zmiana pliku csv zależy od oprogramowania, nie format CSV per se.
Roman Luštrik,

Odpowiedzi:

9

Zastanawiam się, czy tutaj dochodzi do kolizji kryteriów.

Jedną skargą dotyczącą formatów plików, takich jak Excel, SQL itp., Jest to, że musisz wcześniej zdefiniować typy danych, aby dobrze się zachowywały, co jest sprzeczne z kryterium „czegoś mniejszego” (ponieważ rozumiem, że twoje ograniczenie to więcej czasu) powiązane niż związane obliczeniowo).

Natomiast kryteria, zgodnie z którymi nie jest pomijane dane, ani nie pozwalają na pomijanie danych, wymagają pewnego sprawdzenia błędów. O ile nie pozwolisz systemowi na automatyczne rozpoznanie typów danych (co w zasadzie powoduje, że Excel Cię zawodzi), nie ma sposobu, aby zjeść ciasto i zjeść je.

IMO, z tych dwóch, drugie kryterium jest ważniejsze. Po naruszeniu integralności danych analiza jest trudna lub niemożliwa. Utracone obserwacje lub nieprawidłowe wartości (jeśli nie są odpowiednio sprawdzone) mogą wszystko zepsuć.

W odniesieniu do DIF, rzeczywisty tekst surowy nie jest czytelny dla człowieka i byłoby trudne (IMO) dla ludzi do wprowadzania danych.

IMO, powinieneś wstrząsnąć rozdzielanymi plikami. Jak wspomniano powyżej w komentarzach, „zakłócanie danych” jest głównie winą podzbioru używanych narzędzi. Dobrze zachowujące się programy nie powinny zmieniać plików rozdzielanych granicami. Największym źródłem zniekształceń jest źle określony ogranicznik. Na przykład jeśli Twoje dane mogą zawierać przecinki, CSV jest nieodpowiedni. Jeśli może mieć zakładki, TSV jest nieodpowiedni. W przypadku wielu (ale nie wszystkich) programów można określić alternatywny ogranicznik. Na przykład użyłem tyldy (~) w kilku trudnych przypadkach.

russellpierce
źródło
Dzięki. Wygląda na to, że najlepszym rozwiązaniem może być stosowanie formatu plików z ogranicznikami z odpowiednią ostrożnością.
Jeromy Anglim,
6

Z całą powagą rozważę pliki RData utworzone przez samego R, gdy pasuje

  • niezawodny (sprawdź)
  • proste (nazwij to remis - format jest binarny)
  • open (zaznacz: nie otwiera się bardziej niż kod źródłowy R)
  • interoperacyjny (sprawdź: działa wszędzie R działa)

Wystarczająco blisko dla mnie. Jeśli przez systemy masz na myśli aplikacje a nie system operacyjny, to ostatnim punktem jest awaria.

Aha, a RData jest wydajna, ponieważ pliki są teraz domyślnie kompresowane (co było kiedyś opcją domyślnie wyłączoną).

Dirk Eddelbuettel
źródło
2
RData z pewnością działa dobrze z R. Może to być problematyczne w odniesieniu do kontroli wersji. Przypuszczam, że funkcja R dput()zapewnia alternatywny tekst, który działałby z kontrolą wersji. Jednak jednym z odwołań csv / tsv jest to, że kiedy udostępniam repozytorium z danymi (np. W artykule z czasopisma), ludzie mogą pobrać dane i ponownie je przeanalizować za pomocą dowolnego oprogramowania, które im się podoba.
Jeromy Anglim,
1
Tak, to bardzo skomplikowana sprawa. Myślę, że ludzie rozmawiali o tym od zarania komputerów. Miałem jeszcze dwie przemyślenia (i mogłem rozwinąć moją odpowiedź): bufory protokołów są dobre do wydajnego udostępniania w Pythonie, Javie, C ++, ... i wielu innych językach; Romain i ja omawiamy R. Nowa strona miliata.org obejmuje to badania w zakresie uczenia maszynowego - mają nawet narzędzia, które udostępniają do konwersji. To może być warte obejrzenia.
Dirk Eddelbuettel,
1
W rzeczywistości SVN bez problemu przyjmuje binarne obiekty BLOB, takie jak pliki pdf itp. Podejrzewam, że git też.
Dirk Eddelbuettel,
Dobrze wiedzieć o binarnych obiektach blob. Byłoby miło móc uruchomić diff na plikach tekstowych i uzyskać istotne informacje o zmianach. Dziękujemy również za link do mldata.org. To wygląda interesująco.
Jeromy Anglim,
Przyjemność. Strona siostrzana mloss.org jest po prostu świetna, jeśli mam nadzieję, że dostaną trakcję dla miliata.org. Czas na to jest odpowiedni.
Dirk Eddelbuettel,
4

W odpowiedzi na odpowiedź Dirka Eddelbuettela sugeruję użycie formatu pliku HDF5 . Jest mniej prosty niż format RData, lub można powiedzieć, „bardziej bogaty”, ale z pewnością bardziej interoperacyjny (może być używany w C, Java, Matlab itp.). Przekonałem się, że operacje we / wy dotyczące dużych plików HDF5 są bardzo szybkie.

shabbychef
źródło
(+1) Czy sądzisz o jego wydajności w porównaniu do NetCDF ?
chl
IIRC, który jest także formatem wewnętrznym wybranym na mldata.org - z pakietem narzędzi do konwersji. Konwertery mogą być warte obejrzenia. Zawsze miałem wrażenie, że obsługa R dla HDF5 była mniej doskonała.
Dirk Eddelbuettel,
@chl Myślałem niejasno, że NetCDF używał HDF5 wewnętrznie, ale wydaje się to nie całkiem dokładne.
shabbychef
2

Nie jestem do końca pewien, dlaczego ustalony format tekstu z odpowiednimi metadanymi nie spełnia twoich kryteriów. Czytanie nie jest tak proste jak separator, ale i tak potrzebujesz metadanych, aby korzystać z informacji. Zadanie pisania składni do odczytu programu zależy po prostu od tego, jak duża i skomplikowana jest struktura zbioru danych. SPSS i Excel mają graficzny interfejs użytkownika ułatwiający wykonywanie tych zadań.

Występują tylko dwa błędy w plikach CSV:

  1. Brakujące pola bez ograniczników (więc każde inne pole w tym rekordzie jest niewłaściwie umieszczone, miałem również ten problem z brakującymi znacznikami w XML)
  2. Przecinek w ciągu tekstowym

(jeśli napotkałeś inne problemy, podaj przykłady)

Dwa rozwiązuje się z bardziej nieregularnym ogranicznikiem, jak sugeruje drnexus (potok (|) to taki, z którym się wcześniej spotkałem, ale tylda (~) działa równie dobrze, ponieważ żadne z nich prawdopodobnie nie będzie zawarte w polach łańcuchowych.) Jeden jest problem, którego nie można łatwo rozwiązać za pomocą oprogramowania, którego używasz, i oba są problemami ze sposobem, w jaki ludzie pisali pliki na początku, a nie oprogramowaniem używanym do ich odczytu.

Chciałbym również powiedzieć, że zgadzam się z drnexusem zarówno w tym wątku, jak i jego odpowiedzią na twój ostatni wątek dotyczący edytowania tych plików. Wygląda na to, że narzekasz na oprogramowanie, którego używasz (w szczególności Excel) i prosisz o przechowywanie danych w formacie zgodnym z twoim źle zachowanym oprogramowaniem. Być może pytanie powinno brzmieć, jak przekonać Excela do zatrzymania automatycznego formatowania zwykłych plików tekstowych. Twoje wiarygodne kryteria, jak mi się wydaje, to problem z oprogramowaniem do odczytu zwykłych plików tekstowych. Nie używam R do zarządzania danymi, ale nie miałem tak trudnego czasu czytając pliki rozdzielone w SPSS, jak się wydaje.

Jeśli oryginalne pliki nie są poprawnie zapisane, co powoduje, że jakiekolwiek oprogramowanie niezawodnie odczytuje plik? A konkretny format pliku z pewnością nie zapobiegnie niepoprawnemu zapisaniu danych do dowolnego typu pliku, od którego chcesz zacząć.

Andy W.
źródło
(1) Chciałbym móc otwierać i zamykać plik danych tak łatwo, jak mogę otworzyć plik danych Rdata, Excel lub SPSS. Spędzanie czasu na przechodzeniu przez kreatora działa, ale nie jest to prosty i niezawodny przepływ pracy, który idealnie bym chciał. (2) Tak, zgadzam się na użycie nieregularnego separatora. Ogólnie Tab jest dla mnie wystarczający przez większość czasu; (3) Nie mam dużych problemów z CSV / TSV. Od czasu do czasu mam problemy, które można łatwo rozwiązać. Chciałbym jednak nie myśleć o problemach ograniczników i konwersji formatu.
Jeromy Anglim,
@Jeromy Anglim, dla punktu nr 1, domyślam się, że zwykle musisz to zrobić tylko raz (chyba że często migrujesz między dwoma różnymi środowiskami, które nie mogą czytać ani wysyłać innych plików). W punkcie 3 poprawione pliki tekstowe rozwiązują ten problem. Nigdy nie spotkałem się z sytuacją, w której SPSS nieprawidłowo sformatował inny typ pliku. Jeśli nie musisz rozpowszechniać plików, całe pytanie jest wyciszone, jeśli możesz uzyskać poprawny zapis pliku w dowolnym środowisku, w którym będziesz pracować, nie ma już potrzeby konwersji / przechowywania.
Andy W
1

Częstym problemem związanym z formatem zwykłego tekstu jest to, że nie można przechowywać metadanych. Jak zdefiniować brakujące dane? Jak zdefiniujesz 1 = zdecydowanie się nie zgadzam, 2 = nie zgadzam się, ... rodzaje rzeczy w formacie zwykłego tekstu? W formacie zwykłego tekstu musisz użyć innego dokumentu, aby zdefiniować te metadane. I nie jest to łatwe w XML.

Czasami ten problem może być bardzo niepokojący.

Moim rozwiązaniem jest użycie formatu danych SPSS, który jest samodzielny i łatwy do edycji w SPSS. Wiem, że nie jest to prawidłowa odpowiedź na twoje pytanie, ale zmagam się z tym samym problemem od bardzo dawna i to jest moje obecne rozwiązanie.

Jfly
źródło