Next txtテーブルをcsvテーブル形式に変換

Next txtテーブルをcsvテーブル形式に変換

次の形式のUnixテーブルがあり、出力として隠されています。

+--------------------------+-------------------------+-+
|           col_name       |        type             |   
+--------------------------+-------------------------+-+
| Name                     |    String               |
| Date                     | Fri 29 13:17:2020       |
+--------------------------+-------------------------+-+

出力:

"col_name","type"
"Name","String"
"Date","Fri 29 13:17:2020"

どんな助けでも大変感謝します。

答え1

この試み:

input ()
{
  cat <<EOF
+--------------------------+-------------------------+-+
|           col_name       |        type             |
+--------------------------+-------------------------+-+
| Name                     |    String               |
| Date                     | Fri 29 13:17:2020       |
+--------------------------+-------------------------+-+
EOF
}

input |
  tr -d '|+-' |                # remove decoration
  grep -v ^$ |                 # remove empty lines
  while read first rest; do    # read first token and rest of the line
    printf '"%s","%s"\n' \
           "$first" "$rest"    # format as required
  done

答え2

ソースコードは、コンソールのdbaseクライアントへの応答に似ています。しかし、おそらくメモ帳でUnixのテキストを開くと、行末と多くのスペースが失われます。生形式(比例フォント)を使用すると、ソースは見やすいテーブルを形成します。

+--------------------------+-------------------------+-+ 
| col_name                 | type                    |
+--------------------------+-------------------------+-+ 
| Name                     | String                  | 
| Date                     | Fri 29 13:17:2020       | 
+--------------------------+-------------------------+-+

実際の内容が何であるかを確認するには、16進エディタでテキストファイルを確認してください。要求された形式に変換するコマンドを作成できます。 (形式上コメントとして書き込めません。これは何ですか?)

答え3

すべてのフィールド値に引用符を含めることができない場合は、次のawkプログラムがアクションを実行する必要があります(結果は正規化されていないCSVになります)。

awk -F'|' -v OFS="," '/^\+/{next} {for (i=2;i<NF;i++) {gsub(/^ *| *$/,"",$i); printf("\"%s\"%s",$i,i<(NF-1)?OFS:ORS)}}' input.txt

これは

  • |フィールド区切り文字として扱われる
  • 次の行はすべて無視してください。+
  • |開始しない行の最初と最後の「フィールド」を無視し(最初と最後の後ろの「内容」なので空白です)、残りのフィールドを+印刷し、スペースを削除して次に置き換えます。二重引用符は、フィールド区切り記号で引用符で囲みます,

セル内の先行および末尾の空白は純粋に見た目の空白であり、入力ファイルに空白行が含まれていないと仮定します。

関連情報