次のような特殊文字を含むソースからの大量のCSVデータストリームを処理しています。
`÷ Þ Ÿ ³ Ù ÷`
これらの文字を含むデータセットの行の例を次に示します。
'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'
別のデータセットから取得した別の例を次に示します。
WCP16,2013-06-04 20:06:24,2013-06-04,CPU,PrimeNumberGenerationTest,PASS,USA,HF0SXV1,,,N,9999
WCP06,2013-06-04 20:06:24,2013-06-04,CPU,RegisterTest,PASS,USA,HF0SXV1,,,N,9999
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 で処理できます。
しかし、私の状況では、ある日にどのような種類のデータを取得できるかわかりません。その結果、仕事が失敗しています。したがって、データからすべての特殊文字を削除する方法が必要です。
「特殊文字」が何を意味するのか正確にはわからないので、- [〜#〜] ascii [〜#〜] 文字以外を削除したいと仮定します。 。あなたのために働くかもしれないいくつかの異なるツールがあります。最初に頭に浮かぶのは次のとおりです。
iconv
(国際化変換)tr
(翻訳)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' , '', ''