shaks
@shaks

Как начать чтение файла с определенной строки?

Задача следующая:
Есть файл, длина строк в нем разная. Какая-то строка может быть 10 байт, какая-то 100, какая-то 500. Каким образом начать чтение файла с начала той или иной строки, при этом не читая весь файл?

Напрашивается решение:
Сделать фиксированную длину каждой строки, допустим 500байт. Таким образом, зная размер файла, мы можем с легкостью вычеслить на каком байте находится нужная строка и переместить на нужный байт указатель и начать чтение. Но, таким образом, размер файла существенно увеличится + есть вероятность что в выделенный лимит не все строки влезут.
Какие еще варианты?
  • Вопрос задан
  • 3457 просмотров
Решения вопроса 3
@kttotto
пофиг на чем писать
Вы не указали яп. В C# это решается одной строкой кода
File.ReadLines(pathToTextFile)
	.SkipWhile(line => !line.Contains("word"))  // пропустит строки по условию
	.Skip(count)        // сколько строк пропустить надо
	.TakeWhile(line => line.Contains("word"))  // берет строки по условию
	.Take(count)        // сколько строк взять надо

А так, не зная длины строк, как Вы будете смещение делать? Поэтому, кроме предложенного Вами варианта, вариантов и нет) Всякие метки, хеши и индексы я не учитываю, Вы же не хотите размер файла увеличивать.
Ответ написан
solotony
@solotony
покоряю пик Балмера
никак. прочитать и посчитать переводы строк

вру. можно еще сделать индекс.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Программирование
software engineer
1. Ваш вариант вполне подойдет - делаете строки одинаковой длины и перемещаетесь на нужное смещение.
2. Делаете еще один файл, в котором указываете номер строки и позицию в файле. Называется индексирование, и пользуетесь им. Естественно этот еще один файл гораздо меньше.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@evgeniy_lm
В общем только читать каждую строку и пропускать ненужные строки. В разных языках должны быть разные реализации подобной задачи на Delphi можно воспользоватся классом TStringList.

PS Использование строк одинаковой или индексов плохая идея (я бы сказал идиотская с уклоном в сторону говнокода)
Ответ написан
Therapyx
@Therapyx
Data Science
К сожалению это невозможно. На моей памяти нету реализаций, чтобы прямым запросом попасть на строку "х". В любом случае, какие бы функции для этого не было, по типу в 8-й жаве
String lineTarget = Files.readAllLines(Paths.get("file.txt")).get(LineNr)

это всего-лишь для удобства. Чтобы попасть на строку 50, надо прочитать(пропустить) первые 49.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы