CSVファイルの列を視覚的に並べ替える

CSVファイルの列を視覚的に並べ替える

sedまたはを使用してawkCSVファイルの列を視覚的に並べ替えることはできますか?

たとえば、

たとえば、

a,b,c,some stuff,"some, other, stuff",d,2023-03-10 18:37:00
y,x,z,t,cool,thing,2022-04-12 21:44:00

到着する:

a, b, c, some stuff,"some, other, stuff",     d, 2023-03-10 18:37:00<EOL>
x, y, z,          t,                cool, thing, 2022-04-12 21:44:00<EOL>

コンマを含むテキストを含む二重引用符フィールドがあります。

試してみcolumnましたが、bsdmainutilsそうでした。確かにこのデータは処理できません。

ベストアンサー1

このタイプのCSVファイル:

a, b, c, some stuff,"some, other, stuff",     d, 2023-03-10 18:37:00<EOL>
x, y, z,          t,                cool, thing, 2022-04-12 21:44:00<EOL>

いいえ本物フィールドを変更しているので、同じデータファイルを使用しなくなりました。構文解析では、上記の幅のために元のコンテンツが解析されます"t"(非標準の区切り文字を解析するために正規表現を使用しない限り)。" t""some stuff",[variable space]

すべてのフィールドに引用符を適用すると、これらの新しいフィールドをより明確に表示するcsvファイルを取得できます。これを行うRubyメソッドは次のとおりです。

ruby -r csv -e '
cols={}
data=CSV.parse($<.read)
data.transpose.each_with_index{|sa,i| 
    cols[i]=sa.max_by{|e| e.length}; cols[i]=cols[i].length 
}
puts CSV.generate(force_quotes:true){|csv|
    data.each{|row|
        csv<<row.map.with_index{|e, i| e.rjust(cols[i] ) }
    }
}
' file

印刷:

"a","b","c","some stuff","some, other, stuff","    d","2023-03-10 18:37:00"
"y","x","z","         t","              cool","thing","2022-04-12 21:44:00"

または、引用符付きフィールドと引用符付きフィールドが本当に必要な場合は、次のようにします。

ruby -r csv -e '
lcl_csv_opt={:row_sep=>nil}
data=CSV.parse($<.read)
cols=data.transpose.map.with_index{|sa,i| 
    x=sa.max_by{|e| [e].to_csv(**lcl_csv_opt).length}
    [i,"#{[x].to_csv(**lcl_csv_opt)}"]
}.to_h
puts CSV.generate(){|csv|
    data.each{|row|
        csv<<row.map.with_index{|e, i| 
            [e].to_csv(**lcl_csv_opt)==cols[i] ? e : e.rjust(cols[i].length ) 
        }
    }
}
' file

印刷:

a,b,c,some stuff,"some, other, stuff",    d,2023-03-10 18:37:00
y,x,z,         t,                cool,thing,2022-04-12 21:44:00

また、フィールドで迷惑なエスケープ引用符を処理します。一方:

$ cat file
a,b,c,some stuff,"some, other, stuff",d,2023-03-10 18:37:00
y,x,z,t,cool,"""thing"", quoted",2022-04-12 21:44:00

2番目のバージョンでは、次のものを印刷します。

a,b,c,some stuff,"some, other, stuff",                  d,2023-03-10 18:37:00
y,x,z,         t,                cool,"""thing"", quoted",2022-04-12 21:44:00

おすすめ記事