如何将一个 csv 列转换为 n 个包含相等行且每个文件包含标题作为 id 的 csv 文件?

Posted

技术标签:

【中文标题】如何将一个 csv 列转换为 n 个包含相等行且每个文件包含标题作为 id 的 csv 文件?【英文标题】:How to convert one csv column into n csv files which contain equal rows and each file contains header as id? 【发布时间】:2021-11-08 15:50:55 【问题描述】:

我有一个 CSV 文件,其中只包含一列,例如

file.csv
id
c108258e-7feb-46f3-a225-b35bde591463
c4f5bbd3-8576-4201-b297-23b25ff82295
cfcfb84a-0525-4590-b428-fef177172030
9736f570-d1d9-4701-a2c4-6644b0570b4e
e45647a9-fe22-446b-a1c6-5870144d60cc
1782d947-a95c-4817-b809-152bdbf6574d

我想将其转换为 3 个 CSV 文件,每个文件中都包含 id 作为标题。

file1.csv
id
c108258e-7feb-46f3-a225-b35bde591463
c4f5bbd3-8576-4201-b297-23b25ff82295

 
file2.csv
id
cfcfb84a-0525-4590-b428-fef177172030
9736f570-d1d9-4701-a2c4-6644b0570b4e


file3.csv
id
e45647a9-fe22-446b-a1c6-5870144d60cc
1782d947-a95c-4817-b809-152bdbf6574d

请仅使用 awk 或 sed 而非 jq 解决此问题?

【问题讨论】:

想把它转换成 4 个 CSV 文件 那为什么你想要的输出只显示 3 个文件呢?输入中的行数总是可以被 4 整除吗?如果不应该发生,即如何决定每个文件应该有多少行? 【参考方案1】:

awk 代码:

NR == 1  id = $0 
NR > 1  file = "file-" int(NR / 2)
         if (old_file != file)
          close(old_file);
           old_file = file;
           print id > file 
         print $0 > file 

awk 中的记录是从 1 开始编号的。如果第一条记录是一个 ID,并且我们想将后续的记录对分配给连续的自然数,我们只需将记录号除以 2,然后截断为整数:@ 987654322@ 将记录 2 和 3 映射到 1,将 4 和 5 映射到 2,依此类推。

我们从第一个记录中收集id,然后对于所有后续记录,我们将记录写入file-N,其中Nint(NR/2) 文件号。

当我们从一个文件切换到另一个文件时,我们必须关闭前一个文件,否则如果输入很长,Awk 进程可能会达到打开文件数的限制。

换成新文件的时候,也要记得先把id的数字打印进去。

【讨论】:

以上是关于如何将一个 csv 列转换为 n 个包含相等行且每个文件包含标题作为 id 的 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章

将 CSV 列转换为列表

如何将科学数字转换为一般数字

如何将同时具有逗号和空格分隔符的 CSV 文件转换为只有空格分隔符的 csv

遍历多个 html 文件并转换为 csv

将包含 NaN 的 Pandas 列转换为 dtype `int`

如何将 CSV 数据转换为 LabelledPoint 格式?