Можно ли просто заменить определенную строку в файле, не перезаписывая весь файл

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

Может индексировать номера строк в файловых позициях (смещениях). Затем, если вы хотите изменить строку, посмотрите ее положение в файле и найдите файл там. Замените строку, используя write или writeat, следя за тем, чтобы она не перезаписывала данные следующей строки. В противном случае вам придется настроить и написать последующие разделы и переиндексировать эти части. Можно разделить один файл на более мелкие сегменты, чтобы свести к минимуму работу по модификации

Abhijit-K 11.07.2019 13:30

Вам не нужно читать весь файл в память (так называемое "хлюпание"). Накатить можно так: 1) создать новый пустой файл; 2) передать содержимое из существующего файла в новый, пока не встретите строку, которую нужно заменить; 3) выписать строку замены; 4) передать остальные данные исходного файла. 5) Переименуйте новый файл поверх старого. («Конвейер» означает использование чего-то вроде io.Copy в Go. Если вы читаете/пишите построчно, просто используйте соответствующий материал из пакета bufio).

kostix 11.07.2019 15:37

Также, если замещающая строка имеет ту же длину, что и исходная, можно "пропатчить" файл "на месте". Я надеюсь, что логика его реализации должна быть очевидной.

kostix 11.07.2019 15:39
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
3
3
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

линия подразумевает текстовый файл, и, поскольку они обычно имеют разную длину строки, нет возможности заменить строку в файле на диске, если только новая не имеет такой же длины (операционная система не предоставляет возможности открывать или закрывать промежутки). в файле).

Базы данных, с другой стороны, обычно работают с сущностями фиксированного размера (на таблицу), поэтому там база данных может заменить содержимое «записи» новыми данными, а также сохранить список ранее использованных записей, которые теперь удалены и могут быть переработаны при вставке новых данных.

Мне жаль, что я не следую разъяснениям, которые вы предоставили в части базы данных. Не могли бы вы немного уточнить это?

paiakshay998 11.07.2019 13:23

@ paiakshay998 paiakshay998, если вы имеете дело с записями фиксированной длины, например, в базе данных, это, безусловно, возможно, поскольку вы можете просто вычислить смещение записи, которую нужно обновить. Проблема с обычным текстовым файлом заключается в том, что вы не знаете смещение начала определенной строки.

Gerhard Poul 11.07.2019 13:39

Многие базы данных поддерживают эту функцию и без записей фиксированной длины, но в таком случае они также записывают совершенно новые записи, подобно созданию нового файла на диске (в основном то, что уже делает OP).

Flimzy 11.07.2019 14:03

Другие вопросы по теме