【问题标题】:Need to replace accented /diacritics/non ASCII characters in a fixed width file with Space需要用空格替换固定宽度文件中的重音/变音符号/非 ASCII 字符
【发布时间】:2013-02-13 03:29:40
【问题描述】:

需要使用 shell scripting/awk/perl 将固定宽度文件中的重音 /diacritics/non ASCII 字符替换为空格

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

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

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

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

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

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

谢谢

【问题讨论】:

  • “在腻子框中打开文件”是什么意思?我想您可能指的是 telnet/ssh 客户端 PuTTY,但据我所知,它不会打开文件。
  • @ikegami Putty box in sense vi 编辑器中可用。或者如果我在文件上做猫。
  • db 客户端和cat 是否从会话中运行?您期望“JEANNOýýýýýL”的文件中有哪些字节?您的 PuTTY 会话的窗口/翻译/“假定接收的数据”中列出了什么编码?
  • 是的,它是从会话中运行的。以下是编码 ISO-8859-1:1998(Latin-1,西欧)的字符集。它的 unicode 模式。
  • 我的第二个问题呢?

标签: perl shell unix sed awk


【解决方案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

【讨论】:

  • 谢谢。您能否让我知道如何用空格替换文件中的一系列 ASCII 字符或特定的 ASCII 字符。我们还有 Perl 5.8.4,您提到第二个命令仅适用于 Perl 5.10.1。有没有其他方法可以解决这个问题?
【解决方案2】:

使用 sed 的一种方式

sed -i 's:[^[:print:]]:g' infile

【讨论】:

    猜你喜欢
    • 2013-01-29
    • 2023-04-01
    • 2012-08-02
    • 2011-02-08
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多