
有没有人有一个好的解决方案来获取 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