Edycja tekstu w pliku

0

Przykładowe dane wejściowe: http://wklejto.pl/txt247575
Celem programu jest usunięcie w każdej linii znaków od początku aż do _ włącznie z nim.

Dla przykładu. Przed uruchomieniem programu:

10:57 PM	17881_	12	1	0	9	7	7	13	3	5	13
11:07 PM	17882_	5	4	6	4	1	13	1	12	14	10 

Po uruchomieniu programu:

12	1	0	9	7	7	13	3	5	13
5	4	6	4	1	13	1	12	14	10

Próbowałem już na różnie sposoby i nic mi nie wychodzi. Największym problemem jest chyba to że nie potrafię wczytywać danych liniami. Moje programy wczytują zazwyczaj pojedyncze elementy oddzielone spacją lub enterem.
Program powinien zapisywać wynik do osobnego pliku txt.

Myślę że program nie jest długi, ani skomplikowany, mimo to mam z tym problem.
Dane zawszę będą w tym samym układzie. Jedynie po znaku _ mogą być czasem spacje zamiast cyfr, jak na przykładnie w linku.

1

W pętli wczytuj łańcuchy z pliku, następnie funkcją Pos odszukaj indeks znaku _, następnie procedurą Delete usuń znaki od pierwszego do indeksu pobranego funkcją Pos i na koniec zapisz łańcuch do pliku docelowego;

var
  fInput, fOutput: TextFile;
  strLine: String;
begin
  {...}

  while not EoF(fInput) do
  begin
    ReadLn(fInput, strLine);
    Delete(strLine, 1, Pos('_', strLine));
    WriteLn(fOutput, strLine);
  end;

Jeśli białe znaki po znaku _ także mają zostać usunięte - po usunięciu początkowego podciągu, dodatkowo użyj funkcji TrimLeft:

Delete(strLine, 1, Pos('_', strLine));
strLine := TrimLeft(strLine);

To takie szybkie i powolne rozwiązanie, jednak łatwe w implementacji; Jak potrzebujesz super szubkiego rozwiązania to można się pobawić wskaźnikami na znaki i urządzić sobie bardziej niskopoziomową zabawę; Moją ulubioną, jeśli o ciągi znaków chodzi.

0

No dobrze, to by działało, tylko jak mam wczytać łańcuch zawierający całą linie? Niektóre są krótsze od innych z powodu barujących cyfr, poza tym ten łańcuch będzie zawierał 2 typy danych, string i inta. Właśnie z tym mam największy problem :D Potrafię wczytywać tylko pojedyncze cyfry lub słowa, aż do znaku spacji lub entera.

0

No dobrze, to by działało, tylko jak mam wczytać łańcuch zawierający całą linie?

No przecież podałem:

ReadLn(fInput, strLine);

poza tym ten łańcuch będzie zawierał 2 typy danych, string i inta

Nie, łańcuch znaków zawiera tylko i wyłącznie znaki - żadnych liczb i danych innych typów; Dopóki nie powyciągasz podciągów i ich nie przekonwertujesz - wszystko jest zwykłymi znakami;


Pełne rozwiązanie znajduje się w moim poprzednim poście, więc wystarczy je przekopiować oraz dopisać instrukcje otwierające i zamykające pliki.

0

Tak, dzięki za pomoc :D

No przecież podałem:

Wiem, pisałem tego posta w tym samym czasie co Ty edytowałeś swojego. Dopiero po napisaniu zobaczyłem że odpowiednia informacja się pojawiła. Niestety jako gość nie mogłem edytować swojego posta wiec zostawiłem tak jak jest,
Rady pomogły, wszystko działa jak powinno. Czas też jest bardzo dobra, nie potrzebuje bardziej optymalnego algorytmu.

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