フォーマットされたASCII入力からCSVファイルを作成する

フォーマットされたASCII入力からCSVファイルを作成する

私はLinuxを使用しています。

次の形式のファイルがあります

; Header info
;--+-----+--+----+-+----------------
;Co TASK# ID PROP X Remarks
;de (full desc.)
;--+-----+--+----+-+----------------
AAA P00_1 000Lean - not yet done
AAB P00_2 11 Fat  X 20190606
AAC P00_3 1  MidleX canceled

この形式のcsvファイルに変換したいと思います。

Code;Task#;ID;PROP;X;Remarks
AAA;P00_1;000;Lean;-;not yet done
AAB;P00_2;11;Fat;X;20190606
AAC;P00_3;1;Midle;X;canceled

フィールドの長さはさまざまですが、対応する「+」列まで可能です。たとえば、「AAC」で始まる行と「中間」フィールドを参照してください。

最初のステップは、ヘッダー形式の説明で「+」記号を含む列を識別し、「中間」などの「大きい」フィールドを考慮して、各行のこれらの列に「;」を挿入することです(上記を参照)。

Linuxでこの目的を達成するためにawk、sed、または...を使用する方法は?

乾杯!

答え1

固定スキーマがある場合(名前を指定しましたinput-schema.csv

column,start,length
Code,0,4
Task,4,6
ID,10,3
PROP,13,5
X,18,2
Remarks,20,17

あなたはそれを使用することができますcsvkitそして実行します(名前で指定した入力ファイルを使用input.csv)。

<input.csv grep -v '^;' | in2csv -f fixed -s input-schema.csv | csvformat -D ";"

持つ

Code;Task;ID;PROP;X;Remarks
AAA;P00_1;000;Lean;-;not yet done
AAB;P00_2;11;Fat;X;20190606
AAC;P00_3;1;Midle;X;canceled

答え2

GNU awkの場合は、FIELDWIDTHS次を使用します。固定幅データ処理。テーブルの概要からフィールドの幅を取得します。各フィールドの末尾のスペースを削除します。

BEGIN { FS = "+"; OFS = ";" }
NR == 2 { 
  for (i=1;i<=NF;i++) f = (f ? f " " : "") length($i)+1
  FIELDWIDTHS = f
  print "Code;Task#;ID;PROP;X;Remarks"
}
!/^;/ {
  for (i=1;i<=NF;i++) sub(/[[:space:]]+$/,"",$i)
  print
}

使用法:

$ awk -f tst.awk file
Code;Task#;ID;PROP;X;Remarks
AAA;P00_1;000;Lean;-;not yet done
AAB;P00_2;11;Fat;X;20190606
AAC;P00_3;1;Midle;X;canceled

答え3

awk '
NR == 2 {
        for (i = 1; i <= length(); i++) {
                if (substr($0, i, 1) == "+" || i == length()) {
                        fieldWidths[++fieldNr] = i - prevFieldEndPos
                        prevFieldEndPos = i
                }
        }
}

NR > 5 {
        fieldNr = 0
        for (i = 1; i <= length(); i += fieldWidths[fieldNr]) {
                fieldVal = substr($0, i, fieldWidths[++fieldNr])
                gsub(/^[[:blank:]]*|[[:blank:]]*$/, "", fieldVal)
                printf "%s", (i > 1 ? ";" : "") fieldVal
        }
        print ""
}' infile

出力(入力方法が明確ではないため、ヘッダー部分を処理しません):

AAA;P00_1;000;Lean;-;not yet done
AAB;P00_2;11;Fat;X;20190606
AAC;P00_3;1;Midle;X;canceled

関連情報