Przekształcenie pliku tekstowego

1

Witam serdecznie
Mam do napisania programw języku C, gdzie wczytuję z pliku tekstowego dane w następującym formacie:

Nazwisko1;Imię1;HobbyX,HobbyY
Nazwisko2;Imię2;HobbyZ,HobbyX,HobbyY
Nazwisko3;Imię3;HobbyY
...

średnikami oddzielone będą 3 zmienne nazwisko, imię oraz lista hobby danej osoby oddzielona przecinkami (może ich być dowolna ilość)

Muszę na podstawie wczytanych danych stworzyć plik w następującym formacie:

HobbyX:
Nazwisko1 Imię1
Nazwisko2 Imię2

HobbyY:
Nazwisko1 Imię1
Nazwisko2 Imię2
Nazwisko3 Imię3

HobbyZ:
Nazwisko2 Imię2

Proszę o pomoc w nakierowaniu w jaki sposób przekształcić te dane. Odczyt z pliku i zapis do pliku nie jest problemem. Nie wiem do jakiej struktury wczytać dane i jak ją potem przekształcić, aby "wypluć" do pliku w zmienionej formie.

Z góry dziękuję za pomoc

1

Wyższa szkoła jazdy robić to w C :)

Powinna Ci się przydać funkcja http://www.manpagez.com/man/3/strsep/ - żeby sparsować dane oddzielone średnikami, a potem hobby oddzielone przecinkami.

Ja bym to zadanie zrobił tak:

  1. definicja struktury osoba z polami: pełna nazwa i hobby.

  2. dynamiczna tablica struktur osoba - jej rozmiar można poszerzać funkcją realloc w razie potrzeby.

  3. dynamiczna tablica przechowująca unikalne nazwy hobby, tak samo z realloc.

  4. funkcja parsująca linię - będzie dodawała kolejne elementy do tablicy struktur osoba, a także będzie do tablicy hobby dodawała hobby, jakich do tej pory nie dodano.
    Np. przy parsowaniu linii Nazwisko2;Imię2;HobbyZ,HobbyX,HobbyY
    tablica struktur będzie bogatsza o strukturę z elementami: (fullName => "Nazwisko2 Imię2", hobby => "HobbyZ,HobbyX,HobbyY"),
    a tablica hobby będzie miała elementy: ["HobbyZ", "HobbyX", "HobbyY"].

  5. funkcja generująca raport będzie iterować po wszystkich elementach tablicy hobby, dopisując je do raportu, po czym dla każdego hobby będzie iterować po tablicy struktur osoba wypisując pełną nazwę każdej osoby posiadającej wpisane to hobby.

W normalnym współczesnym języku można by to zadanie oprogramować dużo ładniej, stosując chociażby słowniki i prostsze w użyciu (ludzkie w zapisie :D ) operacje na łańcuchach....

2

Ja bym zdefiniował takie funkcje, by zrealizować funkcję słownika:

struct ArrayString;
typedef struct ArrayString ArrayString;

ArrayString* ArrayStringCreate();
void ArrayStringDestroy(ArrayString *array);
void ArrayStringAppend(ArrayString *array, const char *value);
int ArrayStringGetCount(ArrayString *array);
const char* ArrayStringGetValue(ArrayString *array, int index);

struct DictionaryStrArrayStr;
typedef struct DictionaryStrArrayStr DictionaryStrArrayStr;

DictionaryStrArrayStr* DictionaryStrArrayStrCreate();
void DictionaryStrArrayStrDestroy(DictionaryStrArrayStr* dict);
int DictionaryStrArrayStrSetItem(DictionaryStrArrayStr* dict, ArrayString *value);
ArrayString *DictionaryStrGetItemItem(DictionaryStrArrayStr* dict, const char *key);
ArrayString *DictionaryStrGetOrMakeItem(DictionaryStrArrayStr* dict, const char *key);
1

Dziękuję bardzo za pomoc. Dzięki wskazówkom udzielonym w odpowiedziach udało mi się napisać program spełniający wymagane kryteria.
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1