2013-03-19 16 views
7

Pracuję nad kodem C++, który integruje informacje z około kilkudziesięciu plików CSV. Wszystkie zawierają pewne dane rekordów z datą, które chcę wyodrębnić, ale reprezentacja jest nieco inna w każdym pliku. Różnice między reprezentacjami wykraczają poza różne porządki kolumn i nazwy kolumn - na przykład, jeden wiersz z wieloma kolumnami w jednym pliku może być wieloma wierszami w innym pliku.Wzorce projektowe do agregowania heterogenicznych danych tabelarycznych

Potrzebuję więc niestandardowej obsługi każdego pliku, aby utworzyć ujednoliconą strukturę danych, która zawiera niezbędne informacje ze wszystkich plików. Moje pytanie brzmi, czy istnieje preferowany wzór kodu, aby zachować złożoność i kodeks był elegancki? Albo jeśli istnieje dobre studium przypadku, powinienem zbadać, aby zobaczyć, jak tego rodzaju złożoność została rozwiązana w przeszłości.

(Zdaję sobie sprawę, że coś takiego może być łatwiejsze w języku skryptowym, takim jak perl, ale projekt jest w C++ na teraz. Ponadto, moje pytanie bardziej dotyczy tego, czy istnieje wzór kodu, który sobie z tym poradzi - więc odpowiedź brzmi "Trzeba być zbyt specyficznym językowo.)

+0

Prawdopodobnie potrzebujesz pewnego rodzaju widoku na swoje dane ... – ltjax

+0

Czy w katalogu głównym wszystkie dane źródłowe są w przybliżeniu takie same, nawet jeśli reprezentacje są różne?Czy wiesz, zanim otworzysz plik, w którym jest on formatowany, czy najpierw musisz przeczytać wiersz nagłówka? –

+0

Znam formaty apriori, chociaż nie ma prostego sposobu programowego wnioskowania struktury z nagłówków (konwencje używane do nazywania kolumn i formatowania daty są różne, aw niektórych przypadkach nawet struktura wiersza/kolumny różni się między plikami, jak na przykład, o którym wspomniano). – daj

Odpowiedz

3

Jest kilka zwrotów, których używasz w swoim pytaniu, które mnie interesują: custom handling for each file, representation is somewhat different, complexity manageable. Opierając się na fakcie, że będziesz musiał użyć różnych odmian algorytmów parsowania w oparciu o format pliku csv i jesteś (z tego, co wiem), chcąc luźno połączyć twój mechanizm analizowania, poleciłbym wzorzec strategy.

Schemat strategii oddzieli mechanizm analizowania od użytkowników danych zawartych w pliku CSV. Użytkownicy danych nie są zainteresowani tym, w jakim formacie znajduje się plik CSV, ponieważ interesują go jedynie informacje zawarte w tym pliku, co czyni ten wzorzec strategii doskonałym wyborem. Jeśli istnieją podobieństwa między mechanizmami analizowania, można użyć zarówno modelu template, jak i strategii, aby zmniejszyć duplikację i wykorzystać dziedziczenie.

Używając wzorca strategii, można następnie wyodrębnić tworzenie strategii do postaci factory method lub abstract factory, jak widać, dzięki czemu klienci mogą zostać odłączeni od metody analizy.

+0

Dla wzorca strategii zachowanie jest wybierane z wyprzedzeniem, w zależności od danych wykonawczych. Ma zastosowanie tylko tutaj, jeśli pliki mają nagłówek wskazujący format lub jeśli są całkowicie różne. Może to być możliwe, ponieważ OP nie dostarcza żadnych informacji o formacie. – Thibaut

+0

'wybrane z wyprzedzeniem, w zależności od danych wykonawczych ', wydaje mi się sprzeczne ze mną. Masz jednak rację, że musisz mieć wskaźnik, która strategia jest odpowiednia do zastosowania w danym pliku CSV. Zawsze możesz wypróbować je wszystkie i zobaczyć, który z nich działa, jednak nie jest to idealne rozwiązanie problemu. – nattyddubbs

+0

Przepraszam; to nie było zbyt jasne. Z wyprzedzeniem, mam na myśli przed zastosowaniem. Pojedyncza strategia jest wybierana po raz pierwszy w środowisku wykonawczym, a następnie stosowana dopiero po wybraniu. Nie ma nieodłącznego pojęcia rollback, jeśli wybrałeś niewłaściwą strategię. Ten rodzaj wzoru ma zastosowanie tylko wtedy, gdy masz wystarczająco dużo informacji, aby wybrać odpowiednią strategię przed jej użyciem. – Thibaut

0

Nie jestem do końca pewien, co chcesz zrobić z różnymi plikami. Jeśli chcesz używać ich jak tabel bazy danych i masz klucze z dołączonymi informacjami rozproszonymi w wielu plikach, możesz chcieć rzucić okiem na coś takiego jak MapReduce, gdzie najpierw tworzysz część informacji z każdego pliku i agregujesz informacja dzieląca ten sam klucz w drugim kroku.

Struktura danych zależy od układu plików. Prawdopodobnie miałbym dedykowany czytnik dla każdego typu pliku, który przechowywałby informacje w dedykowanych strukturach danych reprezentujących informacje w pliku. Możesz dołączyć klucz do każdej informacji i użyć operacji zmniejszenia, aby scalić wszystkie fragmenty informacji za pomocą tego samego klucza i zebrać je w strukturze proxy. Z drugiej strony, jeśli pomysł polega na budowaniu identycznych obiektów z różnych metod serializacji (tzn. Różne pliki są niezależne, ale reprezentują ten sam typ danych o innym układzie), nie wiedząc z góry, która metoda serializacji została zatrudniony, obawiam się, że jedynym rozwiązaniem pozostaje brutalne wymuszenie deserializacji. Możesz mieć zestaw czytników, po jednym dla każdego typu danych wejściowych i spróbować przeanalizować plik, jeśli się nie powiedzie, następny zacznie się itd., Dopóki nie odkryjesz nowego formatu pliku lub nie znajdziesz odpowiedniego czytnika. Nie sądzę, żeby istniał jakiś wzór, który by to obejmował.

Powiązane problemy