web-dev-qa-db-ja.com

UNIX .csvファイル内のすべてのタイプの特殊文字を削除する

次のような特殊文字を含むソースからの大量のCSVデータストリームを処理しています。

`÷ Þ Ÿ ³ Ù ÷`

これらの文字を含むデータセットの行の例を次に示します。

'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'

別のデータセットから取得した別の例を次に示します。

WCP16,2013-06-04 20:06:24,2013-06-04,CPU,PrimeNumberGenerationTest,PASS,USA,H‌​F0SXV1,,,N,9999
WCP06,2013-06-04 20:06:24,2013-06-04,CPU,RegisterTest,PASS,USA,HF0SXV1,,,N,99‌​99
WCD42,2013-06-04 20:06:24,2013-06-04,DVDMINUSRW,MainICTest,PASS,USA,HF0SXV1,,‌​,N,9999
WCP09,2013-06-05 01:52:53,2013-06-05,CPU,SSE3Test,PASS,,?÷ÞQ»,,,N,9999
WCP10,2013-06-05 01:52:53,2013-06-05,CPU,SSE4_1Test,PASS,,?÷ÞQ»,,,N,9999

予想される文字の種類がわかっている場合は、ファイルを読み取るときに Informatica で処理できます。

しかし、私の状況では、ある日にどのような種類のデータを取得できるかわかりません。その結果、仕事が失敗しています。したがって、データからすべての特殊文字を削除する方法が必要です。

4
deepuu

「特殊文字」が何を意味するのか正確にはわからないので、- [〜#〜] ascii [〜#〜] 文字以外を削除したいと仮定します。 。あなたのために働くかもしれないいくつかの異なるツールがあります。最初に頭に浮かぶのは次のとおりです。

  1. iconv(国際化変換)
  2. tr(翻訳)
  3. sed(ストリームエディター)

iconv(国際化変換)

iconv を使用した解決策を次に示します。

iconv -c -f utf-8 -t ascii input_file.csv

-fフラグ(from)は入力フォーマットを指定し、-tフラグ(to)は出力形式を指定し、-cフラグは、ターゲットに変換できない文字を破棄するようにiconvに指示します。これにより、結果が標準出力(つまり、コンソール)に書き込まれます。結果を新しいファイルに書き込む場合は、代わりに次のようにします。

iconv -c -f utf-8 -t ascii input_file.csv -o output_file.csv

次に、必要に応じて、元のファイルを新しいファイルに置き換えることができます。

mv -i output_file.csv input_file.csv

iconvが最初のサンプル文字列を処理する方法は次のとおりです。

$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | iconv -c -f utf8 -t ascii
'W' , '', ''

tr(翻訳)

tr(translate) コマンドを使用した解決策は次のとおりです。

cat input_file.csv | tr -cd '\000-\177'

\000-\177パターンは octal 表記を使用して0〜127の数値範囲を指定します。これは、ASCII文字の値の範囲です。-cフラグは、trに、この範囲の補数の値(つまり、非ASCII文字に一致する)と-dフラグは、trに(変換の代わりに)削除を実行するように指示します。

結果をファイルに書き込むには、 出力リダイレクト を使用します。

cat input_file.csv | tr -cd '\000-\177' > output_file.csv

trが最初のサンプル文字列を処理する方法は次のとおりです。

$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | tr -cd '\000-\177'
'W' , '', ''

sed(ストリームエディター)

sed を使用した解決策は次のとおりです。

sed 's/[\d128-\d255]//g' input_file.csv

s接頭辞はsedに置換を実行するように指示し、g接尾辞はsedにパターンをグローバルに照合するように指示します(デフォルトでは最初の出現のみが照合されます)。パターン[\d128-\d255]sedに128〜255の範囲の10進数値(つまり、非ASCII文字)の文字を照合するように指示し、2番目と3番目のスラッシュの間の空の文字列はsedに置換するよう指示します空の文字列と一致するパターン(つまり、それらを削除するため)。

他の多くのプログラムとは異なり、sedには、ファイルをインプレースで更新するオプションがあります(別のファイルに手動で書き込んで元のファイルを置き換えるのではありません)。

sed -i 's/[\d128-\d255]//g' input_file.csv

sedが最初のサンプル文字列を処理する方法は次のとおりです。

$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | sed 's/[\d128-\d255]//g'
'W' , '', ''
6
igal