CsvKitを使用してCSV列を切り捨てる

CsvKitを使用してCSV列を切り捨てる

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認識ツールを接続してデータに必要な変換を実行するための、より柔軟なアプローチです。

  1. csvkitを使用してcsvjsonCSVデータのJSON配列を作成します。
  2. jqJSONデータを読み取り、Second Header値を2文字に切り捨てるために使用されます。
  3. csvkitを使用してin2csvJSONを読み込み、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"

おすすめ記事