Re: Чтение данных из большого текстового файла

А это еще зачем..?

27 (edited by sibprogsistem 2020-05-31 23:36:17)

Re: Чтение данных из большого текстового файла

vovka3003 wrote:

А это еще зачем..?

как я понял Вы пытаетесь загрузить целиком огромный файл
но так любая программа будет тормозить
в общем проверял на файле 203000 строк, работает..

for i :=0 to CSV.LineCount - 1 do
  begin
  Application.ProcessMessages;
  sleep(300);
    Form1.Memo1.Text:= Form1.Memo1.Text+CSV.Fields[i, 0] ;
  end;
  CSV.Free;

Re: Чтение данных из большого текстового файла

Речь об искажении байт, а вы про тормоза...
А про Application.ProcessMessages все в курсе.

29 (edited by vovka3003 2020-06-01 11:06:26)

Re: Чтение данных из большого текстового файла

Вполне жизнеспособный вариант:

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
 FSO, f  : variant;
 str :string;
begin

FSO := CreateOleObject('Scripting.FileSystemObject');
f := FSO.OpenTextFile('D:\1.txt', 1);

While Not f.AtEndOfStream do
    begin
     str := f.Read(5000);
     ShowMessage(str);
     str:='';
    end;
 f.Close;
end;

begin
end.

Читает без проблем кусками указанное количество символов. Пробовал на файле в 400 Мб, памяти сожрал максимум 12 Мб, выдал символы без искажения.

Re: Чтение данных из большого текстового файла

vovka3003 wrote:

FSO := CreateOleObject('Scripting.FileSystemObject');

MS Office должен быть установлен, верно?

Посмотрел в описании VB, вроде можно построчно читать:

ts := f.OpenAsTextStream(ForReading, TristateUseDefault); 
s := ts.ReadLine;

Осталось найти значения констант ))))

Визуальное программирование: блог и телеграм-канал.

Re: Чтение данных из большого текстового файла

k245 wrote:
k245 wrote:

Решение, подсказанное Дмитрием: использовать класс TCSV


procedure Form1_Button9_OnClick (Sender: TObject; var Cancel: boolean);
var
  FileName: string;
  CSV: TCSV;
  i: integer;
begin
  FileName := ExtractFilePath( Application.ExeName ) + 'test.txt';
  CSV := TCSV.Create;
  CSV.FieldSeparator := chr(0);
  CSV.LoadANSIFile(FileName);
  for i :=0 to CSV.LineCount - 1 do
  begin
    ShowMessage( CSV.Fields[i, 0]  );
  end;
  CSV.Free;
end;

Протестировал на файле размером 330 Мб, открывается и читает построчно.

Увы.... тоже не работает, если убрать ShowMessage()...... Печалька sad

В итоге код заработал, но не понятно, что было причиной проблемы... сделал присваивание текстовым переменным, считываю сразу всю строку - стало всё ОК:

tmpWord := Trim( CSV.Fields[i, 0] );

гружу в базу словари ( Хаген, Ожегов, Евремова ). Чуть позже опубликую результат.

Визуальное программирование: блог и телеграм-канал.