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シェルスクリプトです。他のシェルで使用できます。
IFS は、フィールド区切り文字を保持する環境変数です。
IFS をコンマ文字に設定します。
while ステートメントはすべての入力ラインを繰り返します。
読み取り関数はIFS(カンマ)を使用して、入力行を複数の変数に分割します。
do 行は while 文の構造の一部です。各入力行に対して、「do」と「done」の間のすべての行が繰り返されます。
echo コマンドは出力を生成します。各入力行に対して、「read」で埋められた変数の内容を、必要な順序でカンマで区切って印刷します。
したがって、これらのステートメントは各入力行に対して機能し、各行をフィールドに分割し、次の順序でフィールドとともに行を再配置します。
これに関する潜在的な問題の1つは、データフィールドにカンマが含まれている場合はそれを理解するのに十分スマートではないことです。
このシェルスクリプトをファイル(X.shなど)に保存すると、CSVファイルを標準入力(stdin)に送信し、並べ替えられたCSV出力を新しいファイルに保存できます。
猫mycsv.txt X.sh> newcsv.txt