0

shell scripting/awk/perl を使用して、固定幅ファイル内のアクセント付きの /diacritics/non ASCII 文字をスペースに置き換える必要があります

固定幅ファイルにアクセント付きの /diacritics/non ASCII 文字を含む固定幅ファイルがあります。このファイルは、データベースからデータを抽出し、それをファイルにスプールすることによって生成されます。ここでの主な問題は、データベースにクエリを実行すると、これらのアクセント付きの /diacritics/non ASCII 文字がデータベース クライアント コンソールに表示されることです。しかし、このデータをファイルに抽出し、そのファイルをパテ ボックスで開くと、それらの文字は表示されません。

たとえば、データベース コンソールでは JEANNOýýýýýýýL と表示されますが、パテ ボックスでは JEANNOL と表示されます。

これを修正するために、以下のアプローチを試しました。

od -An -tu1 コマンドを使用して、ファイル内の各文字の ASCII 値を検索しました。これらすべてのアクセント付き/diacritics/非ASCII文字について、ASCII値をnullとして取得しており、これをスペースのASCII文字に置き換えています。次に、これらの ASCII 値の文字を出力しています。ここで問題となるのは、入力レコード内の正規のスペースが削除され、この固定幅ファイルの列構造がめちゃくちゃになることです。

アクセント付き文字の ASCII 値をスペースに置き換えた後でも、固定幅ファイルの各レコードの同じ行の長さを維持したいと考えています。

これを修正するために助けを得ることができますか?

ありがとう

4

2 に答える 2

1

データベースには、ETL プロセスで処理されない utf8 でエンコードされた文字が含まれていると思います。

これを処理する最善の方法は、ETL プロセスを変更してこれらの文字を削除することです。

別の方法は、これらの正規表現を使用することです。2 つ目については、最近の Perl を使用する必要があります (私は 5.10.1 を使用しました)。

cat file | perl -lne 's!\x{00}! !g;print' > good_file. <-- this will replace every null to space

cat file | perl -lne 's![^[:ascii:]]! !g;print' > good_file. <-- this will replace every non ascii char to space
于 2013-02-13T08:48:29.740 に答える
0

sedを使用した一方向

sed -i 's:[^[:print:]]:g' infile
于 2013-02-13T14:10:30.010 に答える