sed
またはを使用してawk
CSVファイルの列を視覚的に並べ替えることはできますか?
たとえば、
たとえば、
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