web-dev-qa-db-ja.com

txtファイルをタブで区切られたcsvに変換する

私はLinuxを初めて使いますが、回答済みの質問のリストを調べましたが、私の質問が回答されたかどうかを十分に認識できません。または、特定の小さな問題に答えの1つを適応させることができる場合。

私は上司からデータのテキストファイルを取得しました。上司はコンピューターを一方向に使用することを学びました。そして彼は変わりません。データはほとんどcsvファイルですが、フィールドはすべてコンマやタブ文字ではなくスペース文字で区切られています。また、データのテキストフィールドには埋め込みスペースも含まれます。

各フィールドは、数字または数字とテキストのいずれかであり、すべてのフィールドは可変長であり、一重引用符または二重引用符でオフセットされているものはありません。数値フィールドが優先され、他のテキストフィールドに隣接するテキストフィールドはありません。 [スペース]文字が前後にあるテキストフィールドに埋め込まれた数字はまれです。

残念ながら、すべての[スペース]文字を単に置き換えることはできません。代わりに、一般的に、フィールドブレークは[スペース] [0-9]または[0-9] [スペース]のいずれかの形式になるため、[スペース]文字を[タブ]に変換するかどうかを決定します。文字かどうか。 [スペース]文字が数字の横にある場合、[タブ]文字に変換されます。

したがって、Windowsのメモ帳で検索/置換機能を使用して、数字スペースまたはスペースと数字の組み合わせを検索し、その[スペース]文字を[タブ]文字に変換します。これを10回[0-9] [スペース]し、さらに10回[スペース] [0-9]しなければなりません。これを自動的に行うスクリプトを探しています。

ここに私が得るファイルの例があります。 [スペース]文字(最初の行)で区切られた4つのフィールドが含まれています。次の各行は1つのレコードであるため、2行目は最初のレコードです。 Account2281Units19DescriptionToshiba PX-1982GRSUB {であり、最後にDeltaフィールドには0

Account Units Description Delta  
2281 19 Toshiba PX-1982GRSUB 0  
9618 200 HP MX19942-228b -25  
19246 4 CompuCom HD300g Hard Drive 4

したがって、私が探しているのは、元のファイルを読み取り、フィールド区切り文字である[スペース]文字を文字に変換し、すべてを新しいファイルに書き込むスクリプトです。そして、私は説明が欲しいので、同じ質問を何度も繰り返し続けません。

1
Bobby H.

「スペースをコンマに置き換える」というウェブ検索は非常に有益でしたが、最初はうまくいきませんでしたか? this :のような多くの答えが見つかりましたか?

tr ' ' ',' < input > output

またはタブの場合:

tr '\t' ',' < input > output

そして

sed 's/\s\+/,/g' input > output

\sはスペースクラス([:space:]など)であり、スペースまたはタブまたは改行の実行(+(エスケープ)= 1つ以上の先行文字)を置き換える必要があります。次の例では、それぞれの単一のスペースまたはタブのみを単一のコンマに置き換えます(両方ともtr 'sのように実行します):

sed 's/[ \t]/,/g' input > output

-isedのファイルをその場で編集します(ファイルを直接編集します)

以下は、スペース番号または番号スペースに一致するsedであり、以下の|としてエスケープされたORコマンド/シンボル\|を使用して、コンマで置き換えます。

sed 's/ [0-9]\|[0-9] /,/g'
1
Xen2050

それでは、各行の最初の2つと最後のスペースをコンマに置き換える必要があります。 3番目のフィールドにはスペース自体が含まれている可能性があるため、すべてのスペースを置き換えることはできません。これは、正規表現の置換で行うことができます。動作するsedスクリプト/コマンドは次のとおりです。

sed -re 's/^(\S*) (\S*) (.*) (\S+)\s*$/\1,\2,\3,\4/' in.txt > out.csv

上記の例では、次の結果が返されます。

Account,Units,Description,Delta
2281,19,Toshiba PX-1982GRSUB,0
9618,200,HP MX19942-228b,-25
19246,4,CompuCom HD300g Hard Drive,4

3番目以外の列にスペースが含まれている場合、空のフィールドを処理して完全にブレークするため、これは依然として非常に脆弱です。上司が行ったように手動でフォーマットされている場合、このような不正なデータを導入するのは非常に簡単です。より堅牢なテーブル形式(例:適切なCSV Co.)およびエディター(一般的なスプレッドシートツールはCSVを非常に適切かつ柔軟に操作できます(例:LibreOffice/OpenOffice Calc、Microsoft Excel、Google Docs))。

1
David Foerster