更改 CSV 列布局

更改 CSV 列布局

有没有人有一个好的解决方案来获取 CSV 文件并调整列布局?

例如,我有一个包含标题+数据的文件:

foo,bar,baz
1,2,3

但我想将列布局更改为:

qux,foo,waldo,fred,bar,baz

生成的数据文件如下所示:

qux,foo,waldo,fred,bar,baz
,1,,,2,3

我一直在使用 CSVKit 和其他命令行工具 - 它们似乎更旨在合并/操作数据集而不是列调整。

对于通用且可扩展的解决方案有什么想法吗?

答案1

有很多方法可以完成这个任务。为了易于使用和可扩展性,我推荐使用 Python 和该pandas库。您需要的关键功能是pandas.read_csv()-dataframe.to_csv()这些在 pandas 在线参考中都有详细记录(pd.read_csv,数据帧.to_csv)。

import pandas as pd
df = pd.read_csv('input.csv')
df.reindex(columns=['qux','foo','waldo','fred','bar','baz']).to_csv('outfile.csv')

答案2

嗨,与磨坊主

mlr --csv put '$qux="";$waldo="";$fred=""' then reorder -f qux,foo,waldo,fred,bar,baz input.csv

答案3

#!/bin/bash
IFS=','
while read foo bar baz waldo fred qux
do
    echo $qux','$foo','$waldo','$fred','$bar','$baz
done

解释:

这是一个 bash shell 脚本。它可以与其他 shell 一起使用。

IFS 是一个保存字段分隔符的环境变量。
将 IFS 设置为逗号字符。

while 语句循环遍历所有输入行。

read 函数使用 IFS(逗号)将输入行分隔为多个变量。

do 行是 while 语句结构的一部分。对于每行输入,“do”和“done”之间的每一行都会重复。

echo 命令创建输出。对于输入的每一行,我们按照所需的顺序打印出由“read”填充的变量内容,并用逗号分隔。

因此,这些语句作用于每一行输入,将每一行划分为多个字段,然后以不同的顺序将该行与字段放回一起。

这样做的一个潜在问题是,如果数据字段中嵌入了逗号,它就不够智能,无法弄清楚这一点。

如果将此 shell 脚本保存在文件中(例如 X.sh),则您可以将 CSV 文件作为标准输入 (stdin) 发送,并将重新排序的 CSV 输出保存在新文件中。

猫 mycsv.txt | X.sh > newcsv.txt

相关内容