CSVファイルの列の並べ替え

CSVファイルの列の並べ替え

CSVファイル内のすべての列を列名でソートしようとしています。私が持っているのはこれです:

name  ,adress  ,mobile-number
Ane   ,USA     ,12121212
Joane ,England ,234234

私が必要とする出力は

adress ,name  ,mobile-number
USA    ,Ane   ,12121212
England,Joane ,234234

問題は、3つ以上の列があり、並べ替え順序がわかりませんが、昇順で並べ替える必要があることです。

答え1

Miller(mlr)を使用して、ヘッダーを含む各フィールドの余分なスペースをクリーンアップし、フィールドの順序を変更します。

$ mlr --csv clean-whitespace then reorder -f adress,name,mobile-number file
adress,name,mobile-number
USA,Ane,12121212
England,Joane,234234

(を使用すると、フィールドはフィールドの先頭にのみreorder -f adress移動されます。この場合、同じ効果があります。)adress

または、ヘッダーのソート方法に従ってフィールドを昇順にソートしたい場合:

$ mlr --csv clean-whitespace then sort-within-records file
adress,mobile-number,name
USA,12121212,Ane
England,234234,Joane

答え2

私たちができることは、次のように列を行に置き換えることです。rsBSD Unixから派生したユーティリティで行のみsort(したがって、元のデータの列を効果的にソート)してから、もう一度置き換えます。

まず、カナダ順に住所、携帯電話番号、名前順ですのでご参考ください。 MがNの前に!

ステップバイステップ:

$ cat data
name  ,adress  ,mobile-number
Ane   ,USA     ,12121212
Joane ,England ,234234

$ rs -s, -C, -T < data
name  ,Ane   ,Joane ,
adress  ,USA     ,England ,
mobile-number,12121212,234234,

$ rs -s, -C, -T < data | sort
adress  ,USA     ,England ,
mobile-number,12121212,234234,
name  ,Ane   ,Joane ,

$ rs -s, -C, -T < data | sort | rs -s, -C, -T
adress  ,mobile-number,name  ,
USA     ,12121212,Ane   ,
England ,234234,Joane ,

$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T
adress         mobile-number  name  
USA            12121212       Ane   
England        234234         Joane 

ついに:

$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T | sed -e 's/ \([^ ]\)/,\1/g'
adress        ,mobile-number ,name  
USA           ,12121212      ,Ane   
England       ,234234        ,Joane 

私はUbuntu GNU / Linuxでこれを行いましたsudo apt-get install rs

答え3

使用幸せ(以前のPerl_6)

~$ raku -MText::CSV -e 'my @dta = csv(in => $*IN, sep => ",", strict => True)>>.trim;   \
         my $index = @dta.[0].pairs.sort(*.value).map: *.key;           \
         @dta.=map( *.[$index.cache]); csv(in => @dta, out => $*OUT);'  file

Rakuは、高度なUnicodeをサポートするPerlファミリのプログラミング言語です。上記の言語は、Rakuモジュールのコマンドラインで使用されていますText::CSV

入力例:

name  ,adress  ,mobile-number
Ane   ,USA     ,12121212
Joane ,England ,234234

出力例:

adress,mobile-number,name
USA,12121212,Ane
England,234234,Joane

つまり、メソッド/関数を使用してデータを読み込みcsv(...)、項目の周囲のスペースを削除しtrim@dta配列に格納するために使用します。項目を番号付けに変換し、ing byでソートし、ソートされた数字を取得する方法で、最初の行でAnが$index生成されます。次に、並べ替えられた列で上書きします。最後に、ファイルは標準出力に配置されます。[0]@dtapairssortvaluekey@dta.=$indexcsvout$*OUT

注:ペアを削除するための呼び出しは、>>.trim次のように項目に末尾のスペースを含む二重引用符で囲まれた列値を返します。RFC 4180。など、インデックスコードを追加して列の並べ.reverse替え順序を逆にします[$index.cache.reverse]

>>.trim次のない出力例.reverse

"name  ",mobile-number,"adress  "
"Ane   ",12121212,"USA     "
"Joane ",234234,"England "

https://github.com/Tux/CSV/blob/master/doc/Text-CSV.md
https://docs.raku.org
https://raku.org

関連情報