CSVKitを使用して列の長さを切り取る方法は?
定義は次のとおりです。
- 列1:長さ制限なし
- 2列:<2文字以内>
エスケープされた(引用)列と新しい行を正しく処理する必要があります。
たとえば、
First Header,Second Header
foo,
foo,b
foo,bar
foo,"bar"
foo,"""bar"
foo,"
bar"
しなければならない
First Header,Second Header
foo,
foo,b
foo,ba
foo,ba
foo,"""b"
foo,"
b"
答え1
〜のようにr_31415の返信ただし、変更するフィールド以外のフィールド名を指定したり、フィールドの順序を覚えたりする必要はありません。エマ・ルーオの答えこれに関して):
csvsql --query 'UPDATE stdin SET "Second Header" = substr("Second Header",1,2); SELECT * FROM stdin' <file
JSON認識ツールを接続してデータに必要な変換を実行するための、より柔軟なアプローチです。
- csvkitを使用して
csvjson
CSVデータのJSON配列を作成します。 jq
JSONデータを読み取り、Second Header
値を2文字に切り捨てるために使用されます。- csvkitを使用して
in2csv
JSONを読み込み、CSVを作成します。
csvjson file | jq 'map(."Second Header" |= .[:2])' | in2csv -f json
問題のCSVデータを考慮すると、の出力はcsvjson
次のとおりです。
[
{
"First Header": "foo",
"Second Header": null
},
{
"First Header": "foo",
"Second Header": "b"
},
{
"First Header": "foo",
"Second Header": "bar"
},
{
"First Header": "foo",
"Second Header": "bar"
},
{
"First Header": "foo",
"Second Header": "\"bar"
},
{
"First Header": "foo",
"Second Header": "\nbar"
}
]
の出力はjq
次のとおりです。
[
{
"First Header": "foo",
"Second Header": null
},
{
"First Header": "foo",
"Second Header": "b"
},
{
"First Header": "foo",
"Second Header": "ba"
},
{
"First Header": "foo",
"Second Header": "ba"
},
{
"First Header": "foo",
"Second Header": "\"b"
},
{
"First Header": "foo",
"Second Header": "\nb"
}
]
最終出力:
First Header,Second Header
foo,
foo,b
foo,ba
foo,ba
foo,"""b"
foo,"
b"
答え2
これはcsvsqlソリューションです。
csvsql -d ',' --query 'SELECT "First Header" as "First Header",substr("Second Header",1,2) as "Second Header" FROM data' data.txt
First Header,Second Header
foo,
foo,b
foo,ba
foo,ba
foo,"""b"
foo,"
b"