我有几个巨大的 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)))
Run Code Online (Sandbox Code Playgroud)
并需要几分之一秒(sed需要几分钟,因为即使您告诉它只修改第一行,它也会读取和重写整个文件,忽略标题大小没有改变的关键信息)。
我如何使用“标准 unix 工具”(例如,perl)来做到这一点?
如果您不知道标题的长度,head -n1似乎是获取第一行的合理方法。
要将它就地写回文件的头部,您可以使用 dd:
head -n1 file.csv | ./do-some-processing | dd of=file.csv bs=1 conv=notrunc
Run Code Online (Sandbox Code Playgroud)
的conv=notrunc关键是要保持文件完整的休息,bs=1就是停字节边界上。
| 归档时间: |
|
| 查看次数: |
8473 次 |
| 最近记录: |