Wczytywanie zawartości pliku tekstowego, z bardzo długimi liniami

0

Witam.

Jak można wczytać plik txt, gdzie w jednej linii jest ponad 2000 znaków, a takich linii jest wiele?

Do łańcuchów o wielkości do 255 znaków używałem takiego kodu:

var 
s:string;
f:textfile;

begin

AssignFile(f,OpenDialog1.FileName);
try
Reset(f);

while not eof(f) do
begin
        
     readln(f,s);
      
end;

finally
CloseFile(f);

Jak przerobić to żeby wczytywał łańcuchy większe niż 2000 znaków?

Pozdrawiam

dodanie znacznika <code class="delphi"> - @furious programming

1

Nie wiem czy ten sposób ma jakieś ograniczenia, dawno z tego typu wczytywania nie korzystałem sprawdź tak:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

var
  StringList: TStringList;
begin
  StringList := TStringList.Create;
  try
    StringList.LoadFromFile(OpenDialog1.FileName);//OpenDialog1.FileName);

    //tutaj operujesz sobie na poszczególnych liniach
    //np. StringList[5] to linia 6 w pliku
    
  finally
    StringList.Free;
  end;
end.
0

Nie działa. Zamiast wczytać cały plik, wczytuje tylko 1 linię i zamiast tekstu są trzy znaki "˙ţ=". Tak samo się dzieje, jak wczytuje do richedit`a. Plik jest zwykłym tekstem bez żadnych dziwnych znaków.

2

FileStream i ręcznie parsowanie wydaje mi się jakąś opcją.

1

Typ String może przechowywać praktycznie dowolny łańcuch o dowolnej długości (maksymalna długość to minimum 4GiB), więc z niego skorzystaj; Jeżeli pracujesz pod Delphi, to standardowo na górze modułu masz dyrektywę {$H+}, która oznacza, że typ String traktowany jest jako łańcuch o nieograniczonej długości; Jeżeli tej dyrektywy nie ma, to ten typ jest równoznaczny z typem ShortString i maksymalnie wejdzie do niego 255 znaków;

W takim razie spróbuj dodać dyrektywę {$H+} (lub dłuższą jej wersję - {$LONGSTRINGS ON}), a powinno wszystko działać bezbłędnie; W kodzie który podałeś w pierwszym poście nie ma żadnej dyrektywy, więc najprawdopodobniej to jest przyczyną.

0

Już działa. Plik był w unicode, zamieniłem na utf8 i wszystko widzi. Dzięki za pomoc

0

Mam jeszcze jedno pytanie dotyczące stringlist`a. Jak mogę usunąć z konkretnej linii pierwsze 20 znaków ?

0

Bezpośrednio nie masz dostępu do łańcucha, bo odwołujesz się przez właściwość; Dlatego też możesz użyć procedury Delete, ale jedynie na kopii łańcucha z danego itema;

Przykład:

uses
  Classes;
var
  slFoo: TStringList;
  strTemp: AnsiString;
begin
  slFoo := TStringList.Create();
  try
    slFoo.Add('12345678901234567890Marcinxl');

    strTemp := slFoo[0];     // pobieramy łańcuch z danej linii do zmiennej tymczasowej
    Delete(strTemp, 1, 20);  // usuwamy znaki od indeksu 1 do 20
    slFoo[0] := strTemp;     // wpisujemy nowy łańcuch do tego samego itema listy

    WriteLn('"', slFoo[0], '"');
  finally
    slFoo.Free();
  end;
end.

Na ekranie konsoli ukaże się Twój nick - http://ideone.com/RGb4kQ

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