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"

答え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"

答え3

表示されるまで、CSVKitで直接実装することは可能だとは思わなかった。そうでなければ。しかし、合格が可能だとわかっています。ミラー:

mlr --csv put '${Second Header} = substr(${Second Header},0,1)' file.csv

出力

First Header,Second Header
foo,
foo,
foo,ba
foo,ba
foo,"""b"
foo,"
b"

(Millerバージョン6以降を使用している場合は、より良い、より良い選択肢があります。substrここではテストできないため、含めないでください。)

関連情報