現在、次のように1つの列に並べられた巨大な顧客アカウント情報ファイルがあります。:
各行を分割する区切り文字として使用したいと思います。しかし、これを行うときに各行を分割するときに新しい列を作成し、各行の後のデータを:
その列に入れたいと思います。私の究極の目標は、これをCSV形式に変換して、データ分析および/またはデータベース構築のためにどこかにインポートできるようにすることです。
firstName:John
middleName:null
lastName:Doe
companyName:John Doe Corp
suffix:null
primaryEmail:[email protected]
primaryPhone:555.555.5555
secondaryEmail:[email protected]
secondaryPhone:null
また、これは顧客ごとの総行数ではありません。顧客あたり55行があります。
ベストアンサー1
perl
すべてのデスクトップまたはサーバーのLinuxディストリビューションで利用可能なものを使用してください。
perl -lne '
BEGIN{$,=","}
($k,$v)=split":",$_,2;
next unless defined $v;
for($k,$v){s/"/""/g,$_=qq{"$_"}if/[$,"]/}
$k=$t{$k}//=$t++;
if(exists$f[$k]){print@f;@f=()}
$f[$k]=$v;
END{print@f;print STDERR sort{$t{$a}<=>$t{$b}}keys%t}
' your_file
ファイル全体を処理した後、ヘッダー(フィールド名を含む最初の行)がstderrとして印刷されることを除いて、ファイルを標準CSVに変換する必要があります。使用し... >body 2>hdr
てどこかに保存できますcat hdr body > final_file.csv
。
空行などについては特別な意味はありません。レコードは、順序に関係なく、名前の異なるフィールドのセットで構成されていると見なされます。
,
またはを含むフィールドは"
内部に配置され、"..."
内部は"
2倍に拡張してエスケープされます""
(CSVルールを使用)。
$,=","
たとえば、次のように変更してフィールド区切り記号を調整できます。$,="|"
(または$,="\t"
タブの場合)。行を削除すると、引用符とエスケープを削除できますfor($k,$v){ ... }
。
awk
sed
これは(inまたは代わりに)行うことができます。配列全体を一度に印刷する方法がなく(繰り返し必要)、文字列を分割できないため、tr
もう少し複雑になります。awk
限られた数のフィールド(スキルを使用する必要がありますsubstr
)