如何就地编辑巨大的 CSV 文件的标题?

sds*_*sds 4 unix csv perl

我有几个巨大的 CSV 文件,我想在其中交换两个列名。

不是修改/复制/重写的数据。

该操作在以下方面非常便宜Cfopen文件、fgets标题fseekrewind操作标题(保留其长度)、fputs新标题、fclose文件。

这也可以在ANSI Common LispCLISPSBCLGCL)中完成:

 (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)来做到这一点?

b0f*_*0fh 5

如果您不知道标题的长度,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就是停字节边界上。