У меня есть несколько огромных файлов CSV, в которых я хочу поменять имена двух столбцов.
Я не хочу изменять / копировать / переписывать данные.
Операция в C
очень дешевая: fopen
файл, fgets
заголовок, fseek
или rewind
, манипулировать заголовком (сохранив его длину), fputs
новый заголовок, fclose
файл.
Это также можно сделать в ANSI Common Lisp
(CLISP, SBCL или GCL):
(with-open-file (csv "foo.csv" :direction :io
:if-exists :overwrite)
(let ((header (read-line csv)))
(print header)
(file-position csv 0)
(write-line (string-upcase header) csv)
(file-position csv 0)
(read-line csv)))
и занимает долю секунды (sed
занимает несколько минут, потому что он читает и перезаписывает весь файл, даже если вы говорите ему изменить только первую строку, игнорируя важную информацию о том, что размер заголовка не изменился).
Как мне это сделать с помощью "стандартных инструментов Unix" (например, perl
)?