0

需要使用 shell scripting/awk/perl 用空格替换固定宽度文件中的重音/变音符号/非 ASCII 字符

我们有一个固定宽度的文件,它在一个固定宽度的文件中有重音/变音符号/非 ASCII 字符。该文件是通过从数据库中提取数据并将其假脱机到文件而生成的。这里的主要问题是当我们查询数据库时,这些重音/变音符号/非 ASCII 字符在数据库客户端控制台上可见。但是当我们将这些数据提取到一个文件并在腻子框中打开文件时,我们无法看到这些字符。

例如,我们在数据库控制台中看到的是 JEANNOýýýýýýL,但在腻子框中我们看到的是 JEANNOL

为了解决这个问题,我尝试了以下方法。

使用 od -An -tu1 命令查找文件中每个字符的 ASCII 值。对于所有这些重音/变音符号/非 ASCII 字符,我将 ASCII 值设为 null,我将其替换为空格的 ASCII 字符。然后我为这些 ASCII 值打印字符。这里的问题是输入记录中的一些真实空格被删除并弄乱了这个固定宽度文件的列结构。

即使在我用空格替换重音字符的 ASCII 值后,我也想为固定宽度文件中的每条记录保持相同的行长。

我可以得到帮助来解决这个问题吗?

谢谢

4

2 回答 2

1

我认为您的数据库包含您的 ETL 流程未处理的 utf8 编码字符。

处理此问题的最佳方法是更改​​您的 ETL 流程并删除这些字符。

另一种方法是使用这些正则表达式。对于第二个,您需要使用最近的 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 回答