Wczytanie lini tekstu, które znajduje sie pomiędzy okreslonymi liniami

0

Witam,
pisze w c++, kompilator dev

Wczytuje plik z danymi, o formacie .txt np:

cos_tam_cos_tam
dane=jakis_ciag_znakow
cos_tam_cos_tam

[start]
typ=1
dane=jakis_ciag_znakowA
grupa
[koniec]

cos_tammm
dane=jakis_ciag_znakow
cos_tammmm

[start]
typ=0
dane=jakis_ciag_znakow
grupa
[koniec]

cos_tam

[start]
typ=1
dane=jakis_ciag_znakowB
grupa
[koniec]

cos_tam_cos_tam
dane=jakis_ciag_znakow
cos_tam_cos_tam

mam następujący problem:
chce wybrać z pliku linie, które zawierają się pomiędzy [start] a [koniec], gdzie typ=1 i zaczynają się od 'dane=',

z powyższych przykladowych danych ma wybrac linie:
dane=jakis_ciag_znakowA
dane=jakis_ciag_znakowB

Proszę o pomoc

0
  1. Wywal to antyczne IDE
  2. Jesli masz stala liczbe wierszy pomiedzy znacznikami to mozna chociazby wczytac caly plik do kontenera, nastepnie sprawdzic, w ktorym wierszu wystepuje dany ciag i dodac do stringa ten wiersz i odpowiednia liczbe nastepnych wierszy. Jesli zas liczba wierszy nie jest stala proponuje dodac warunek sprawdzajacy czy wiersz nie zawiera znacznika koncowego.
1

Lekcja na dziś: wyrażenia regularne, albo od biedy przynajmniej std::find()

1

Przepraszam, zle zrozumialem, wiec jesli pobierasz jedna linie to przelatujesz przez caly plik i dodajesz linie nastepna od type=1 sprawdzajac przed dodaniem czy zaczyna sie od dane=.
Poczytaj o kontenerach STL'a i funkcji getline(), wiecej raczej nie potrzeba do zrobienia tego.

0

dzx za odp :)
dokładniej to wygląda tak:

W przykladowych danych których podałem, po lini zaczynającej sie od 'typ=' kolejna linia jest linia zaczynajaca sie od 'dane=', a w rzeczywistosci bede mial dane gdzie pomiedzy tymi liniami (zaczynającymi sie od 'typ=' i 'dane=') bedą tez występowac inne linie.

Fragment danych na których pracuje wygląda tak:

[POLYLINE]
Type=0x5
Label=Jana Pawła II
EndLevel=2
DirIndicator=1
Data0=(49.56691,20.65598),(49.56694,20.65646)
Plik=src\STARY_SACZ.ulice.txt
[END]

[POLYLINE]
Type=0x6
EndLevel=1
Data0=(49.53458,20.64231),(49.53453,20.64200),(49.53482,20.64113),(49.53493,20.64041)
Plik=src\STARY_SACZ.ulice.txt
[END]

[POI]
Type=0xc00
Label=Osobnica Górna
EndLevel=1
City=Y
Data0=(49.69364,21.38819)
Miasto=Osobnica Górna
Plik=src\cities-NowySacz.pnt
Typ=
[END]

[POLYLINE]
Type=0x7
Data0=(49.53411,20.64284),(49.53371,20.64266),(49.53361,20.64249),(49.53293,20.64228)
Plik=src\STARY_SACZ.ulice.txt
[END]

Interesują mnie tylko te linie, które zaczynają się od 'data=', mieszczą sie pomiedzy [POLYLINE] ... [END] i dodatkowo parametr 'typ' bedzie posiadal wartosc z okreslonego zbioru

0

Ponieważ taki plik tekstowy jest często modyfikowany przez ludzi z palucha, to ja bym to normalnie sparsował do jakiejś struktury danych pozwalającej odtworzyć cały poprawny plik. Na przykład do listy par z których pierwszym elementem byłaby nazwa grupy, a drugim mapa odszukanych kluczy i wartości po '=' do każdego wiersza kończącego [END]. Nie oczekiwałbym wtedy jakiejś kolejności poszczególnych przypisań bo najczęściej nie mają one żadnego znaczenia (chyba, że masz dokładną specyfikację takiego pliku, która mówi co innego). To by pozwoliło w razie czego odtworzyć całą zawartość pliku, ale już bez takich możliwych niekonsekwencji, które mogą wyjść podczas parsowania, jak wiersze uszkodzone (np. [], [ABC, ABC], =xxx, zawartość ze znaków spoza akceptowanego alfabetu) czy nadmiarowe puste wiersze (zwykle ignorowane lub dozwolone po jednym między grupami). Krótko mówiąc typ danych w wersji generycznej mógłby wyglądać tak: vector<pair<string, map<string, string>>> (gdzie pair, to obiekt kojarzący dwie parametryzowane wartości). Co do samego parsowania, to odczytując kolejne wiersze z pliku możesz sobie te wadliwe pooznaczać do raportu (numer wiersza i zawartość). W czasie parsowania trzeba by też wykryć rozpoczęcie nowej grupy bez zakończenia poprzedniej lub zakończenie bez otwarcia nowej. W takich plikach nierzadko dozwolone są również komentarze (po jakimś znaku), które trzeba podczas parsowania włączyć do struktury danych, albo dodatkowej listy komentarzy (lub zignorować).

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