Import pliku tekstowego - wyjątek

0

Witajcie,

pokrótce mam plik tekstowy z liniami danych. Importuję go do bazy danych czytając linia po linii i wpisując wartości do zmiennych. Rozpoznaję zawartość linii po pierwszym znaku. Wszystko działa.
Jednak problemem są linie które są puste (hex 0D0A czyli sam enter). Gdy na takie natrafiam i sprawdzam pierwszy znak dostaję wyjątek.
Oto mały przykład kodu jaki stosuję (całkowity standard):

 

var  plik_wejscie : TextFile;
     dane, dwukropek, srednik : String;
begin
  AssignFile(plik_wejscie, 'c:\1.txt');
  Reset(plik_wejscie);

  try
    while not eof(plik_wejscie) do
      begin
        Readln(plik_wejscie, dane);

        if (dane[1] = ':') then
          dwukropek:=dane;

        if (dane[1] = ';') then
          srednik:=dane;
      end;
  finally

  end;
  CloseFile(plik_wejscie);
end;

Try nie chroni przed wyjątkiem.

Czy znacie sposób obejścia tego problemu? Acha, znak enter (na którym się wykładam) nie musi kończyć pliku, chciałbym czytać plik aż do końca (eof).

Pozdrawiam
Robert

3

TStringList.LoadFromFile

1

@robertz68 - pusta linia nie zawiera żadnego znaku; Wewnętrzne mechanizmy procedury Readln czytają z pliku znaki dotąd aż natrafią na zakończenie linii (zależnie od platformy - CR lub CRLF), ale tych znaków już nie dodają do łańcucha; Dlatego też nie możesz w kółko sprawdzać pierwszych znaków, bo puste linie nie posiadają ani jednego;

Zmień warunek na taki:

while not EoF(plik_wejscie) do
begin
  ReadLn(plik_wejscie, dane);

  if Length(dane) > 0 then
  case dane[1] of
    ':': dwukropek := dane;
    ';': srednik := dane;
  end;
end;

i wszystko będzie działać; Ale zastanów się też nad propozycją poprzednika, bo konstrukcja której używasz wywodzi się z dawnego Pascala i raczej rzadko się jej stosuje;

Druga sprawa to dwa warunki If, które nie posiadają Else, więc oba mimo wszystko będą sprawdzane; Dlatego też w swoim przykładzie zastosowałem instrukcję wyboru Case, aby to wykluczyć; Poza tym nazywaj sensownie zmienne i trzymaj się jednego standardu, a łatwiej będzie pisać kod (i łatwiej będzie go zrozumieć).

0

dzięki koledzy, kompletnie nie pomyślałem że mogę sprawdzić długość łańcucha. Ot takie zaciemnienie umysłu.
Przyjrzę się też klasie TStringList (kiedyś nawet ją stosowałem), chociaż jestem przyzwyczajony do standardowego podejścia do plików :).
Co do if-a bez else czy też nazywaniu zmiennych - to tylko malutki przykład aby nie tylko pisać a pokazać na czym polega mój problem (jest to lepiej przyjmowane na forum i rozumiem to).
Ogólnie to co piszę to duży parser plików wyciągów bankowych z formatu mt940 na format zrozumiały oprogramowaniu FK. Mam już obsłużone kilka banków. Oczywiście są i else i zmienne nazywają się bardziej logicznie :).

Jeszcze raz dziękuję - zawsze można liczyć na ludzi z tego forum.

Pozdrawiam
Robert

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