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

Wczytywanie zawartości pliku tekstowego, z bardzo długimi liniami
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
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:

Kopiuj
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

szopenfx
  • Rejestracja: dni
  • Ostatnio: dni
1

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

Kopiuj
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.
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
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.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
2

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

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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ą.

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
0

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

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
0

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

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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:

Kopiuj
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.