Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2008, 00:00   #21
Deight
Бредовый
Форумчанин
 
Аватар для Deight
 
Регистрация: 15.11.2008
Сообщений: 285
По умолчанию

Тысяча извинений за ту ерунду что наговорил, видать сайт где я такое видел левый какой-то. Пол дня пролазил в нете но так ту страницу и не нашел.
Чем точнее и проще задан вопрос, тем проще на него получить точный ответ.
Deight вне форума Ответить с цитированием
Старый 10.12.2008, 07:35   #22
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию

Цитата:
- предварительно проиндексировать файл - запомнить смещения от начала файла всех строк в специальном индексном файлике, его грузить в память и позиционироваться в текстовом файле по этому индексу.
Этот способ имеет право на жизнь только если работать с текстовым файлом надо много и часто и он не меняется...
Можно в эту сторону поподробнее? Мне кажется неплохой вариант.
Pedro вне форума Ответить с цитированием
Старый 11.12.2008, 00:35   #23
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Можно в эту сторону поподробнее? Мне кажется неплохой вариант.
Вы понимаете, что выигрыш тут происходит только за счёт того, что файл предварительно долго обрабатывается (для него создаётся индексный файл)? и что, если исходный файл изменится, то индекс надо перестраивать?!

Если Вы это понимаете, то дальше просто...
что тут особо рассказывать...

Объявляете
f:file of LongInt;
OffS : longInt;
begin
Assign(f,'index.itx');
Rewrite(f);

потом загружаете исходный файл хотя бы в тот же
TS : StringList (TS.LoadFromFile('биг.txt')
далее:
OffS := 0;
for i:=1 to TS.Count-1 do begin
Write(f,OffS);
OffS := OffS + Length(TS.Strings[i]) + 2; {два байта - это на перевод строки. Обязательно посмотреть HEX вьювером и убедится, что строки в вашем текстовом файле разделяются именно двумя байтами (обычно это 0x0D, 0x0A или CR LN или ВК ПС или \r\n - это всё одно и то же, просто кто к чему привык ;-))))}
end;
CloseFile(f);

всё. создание индекса закончено.


дальше. для использования.
читать индексный файл (либо в память в динамический массив, либо seek'акть прямо в индексном файле на нужную строку.
Читаем смещение в переменную (например, в LineOffs)
Дальше в текстовом файлике:
Seek(FText, LineOffs)
всё. мы стоим на начале нужной строки!

p.s. кстати, я бы _очень_ рекомендовал для чтения текстового файла использовать компонент TStreamFile
там есть метод Seek...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.12.2008, 10:51   #24
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вроде работает..вот за пару минут накатал

Код:
var
  f: File;
  buf: array[0..1023] of Char;
  ret, i: Integer;
  curline, line: Integer;
  offset, len: Integer;
  s: String;
begin
  line := 3;

  {$I-}
  AssignFile(f, 'someone.txt');
  Reset(f, 1);

  s := '';
  offset := 0;
  len := 0;
  curline := 1;
  while (Len = 0) do
  begin
    BlockRead(f, buf, SizeOf(buf), ret);
    if (ret <= 0) then
      Break;
    
    for i:= 0 to ret - 1 do
    begin
      if (buf[i] = #13) then
      begin
        if (curline = line) then
        begin
          Len := FilePos(f) - ret + i - offset;
          Break;
        end;
        inc(curline);
        offset := FilePos(f) - ret + i + 1;
      end;
      if (buf[i] = #10) then
        inc(offset);
    end;
  end;

  if (Len = 0) then
    Len := FilePos(f) - offset;
  if (Len > 0) then
  begin
    SetLength(s, Len);
    Seek(f, offset);
    BlockRead(f, Pointer(s)^, Len);
  end;

  CloseFile(f);
  {$I+}

  Caption := Format('Line %d = "%s"', [Line, s]);
end;
BOBAH13 вне форума Ответить с цитированием
Старый 11.12.2008, 14:56   #25
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

BOBAH13, слов нет. Программка Отличная!
Супер! обязательно сохраню её себе в копилочку!

Вот только тут обсуждение идёт того, что из больших файлов быстро читать не очень получается...

Например, Ваша функция у меня из текстового файла размером 820 МБ (22000000 строк) строчку в конце файла (седьмую от конца, например) читает ~42 секунды. А что, если после этого (допустим кому-то), надо прочитать 100 строку, потом третью, потом 1000000, .... ) - затраты времени потребуются просто колоссальные.. :-(

Ещё раз повторю - без конкретных условия, что есть в наличии, что за файл, какие там переводы строк, размер, количество строк, изменяется ли он, и что требуется получить (постановка задачи, требования по времени исполнения) - тут можно дискутировать до бесконечности...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.12.2008, 15:14   #26
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Нашелся человек, который вернул всех все таки к вопросу старттопика:
Цитата:
Вытащить строчку из файла
Есть ф-ия GET(№строки) - она Вам и вернет нужную строку, как и просит автор вопроса.
Но все таки обсуждение получилось занятным и о-очень полезным.Хоть целую тему выделяй - "Работа с текстовыми файлами".
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 11.12.2008, 15:44   #27
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от DeKot Посмотреть сообщение
Нашелся человек, который вернул всех все таки к вопросу старттопика:

Есть ф-ия GET(№строки) - она Вам и вернет нужную строку, как и просит автор вопроса.
Но все таки обсуждение получилось занятным и о-очень полезным.Хоть целую тему выделяй - "Работа с текстовыми файлами".
О чем вы ? какая get ? что это вообще такое. или это так англслово по теме ? без обид... но я ниче не понял...

автору: если вопрос в силе могу реализовать на легке то что вы хотите... и тут дело в том что буфер можно увеличить на сколько угодно... и в таком разе заходов в blockread меньше будет. И все-таки если файл постоянен и очень редко меняется то способ Serge_Bliznykov подойдет в полне.
BOBAH13 вне форума Ответить с цитированием
Старый 11.12.2008, 16:15   #28
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Из Delphi 7:


Или для
Код:
var f: TStrings;
  Stroka(: string):= f.Strings[N_stroka(: integer)];
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось DeKot; 11.12.2008 в 16:19.
DeKot вне форума Ответить с цитированием
Старый 11.12.2008, 16:25   #29
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Смешно... а как тут говорят размер 100 мб даже.. ну представьте весь этот текст впихнуть в TStringList вы себе представляите обработку загрузки 100 МБ в память ? P.s. вы чтот не много не учли
BOBAH13 вне форума Ответить с цитированием
Старый 11.12.2008, 16:29   #30
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

DeKot, Вы отстаёте от темы.. Это же метод абстрактного класса TString (или его потомка - TStringList)
Но чтобы получить строчку по номеру туда файл сначала надо загрузить через TStringList.LoadFromFile(...) - а это долго...

мне кажется, что мы по кругу ходим.. По крайней мере, мне, в настоящий момент, по существу обсуждаемого вопроса добавить уже нечего... ;-)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните строчку, пожалуйста Manya Общие вопросы C/C++ 2 20.11.2008 16:02
Рразъясните строчку. Amen Помощь студентам 11 30.08.2008 02:45
Как с поиощью hiew вставить в файл строчку, "раздвинуть" файл и вставить туда строчку? barand Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 28.06.2008 10:58
DBLookupComboBox на первую строчку Inbox БД в Delphi 7 29.10.2007 13:26
HELP! Как мне вытащить текст из файла? kl45gp Общие вопросы Delphi 12 17.08.2007 22:26