Как отредактировать строку файла в юлии? - PullRequest
3 голосов
/ 19 сентября 2019

Я могу прочитать файл и найти специальную строку на основе предиката, подобного этому

open(file, read=true, write=true, append=true) do io
    for line in eachline(io)
        if predicate(line)
            new_line = modifier(line)
            # how to replace the line with new_line in the file now?
        end
    end
end

Но как мне теперь изменить содержимое файла?

1 Ответ

4 голосов
/ 19 сентября 2019

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

Таким образом, вы можете либо

  1. прочитать весь файл, изменить то, что вы хотите изменить, а затем записать весь файл в то же место
  2. читать построчно, писать в новое местоположение, а затем копировать новый файл в старое местоположение

Последнее, вероятно, лучше, если у вас действительно гигантские файлы (так что вы ненужно хранить все это в памяти).У вас есть большая часть кода, это всего лишь вопрос создания временного файла и последующего копирования обратно в исходный путь.Что-то вроде:

(tmppath, tmpio) = mktemp()
open(file) do io
    for line in eachline(io)
        if predicate(line)
            line = modifier(line)
        end
        write(tmpio, line)
    end
end
close(tmpio)
mv(tmppath, file, force=true)

ПРИМЕЧАНИЕ: если это находится в глобальной области видимости (например, не внутри функции), вам, возможно, придется поместить global перед tmpio внутри блока do,В качестве альтернативы, оберните все это в let. Смотрите здесь .

...