当前位置: 首页 > 知识库问答 >
问题:

使用Hadoop Map-Reduce删除不可打印字符

易琨
2023-03-14

我试图处理一个HDFS文件,其中有不可打印的chracters。我希望使用MapReduce删除这些字符。

我曾尝试使用Pig TextLoader和MR TextInputFormat(在MR程序中),结果将记录从遇到不可打印字符的位置拆分为多个。下面是示例数据:

===数据==(2条记录)=

 4614:2011-12-20-08.45.08.169176^2011-12-20-18.15.08.100008^597^0^57^ZUKA^Grase^^^Grase,Dr^^^N^N^N^Dr^KG^ONLY INFORMATION ENTERED^UNKNOWN^0     ^      ^^^611190362
�^0^^^^^^0^Grase,Dr^^^, ,^^^^^^597^^^<fnm>DR</fnm><lnm>GRASE</lnm>^^^^^^^^SINGLE^0^0
6063:2010-07-04-04.00.00.100001^2010-07-04-04.01.00.180144^017^0^095^WEETE    ^Wien^^^Wien,Colock^^^N^N^N^Colock^KG^ONLY INFORMATION ENTERED^UNKNOWN^0     ^      ^295111915^^������9905^0^^^^^^0^Wien,Colock^40001 KIN RD^300 CAMORE ST^500 BLACK AVE^Woesfield, HA, 43723.^John Ball^^^25719110^617^������9905^^<fnm>COLOCK</fnm><lnm>WIEN</lnm>^^^^^^^^SINGLE^0^0

下面是我使用基本UDF所做的尝试(代码片段如下)。不过,该程序正在对>0x80的charcters进行条带化,但对拆分的记录执行条带化。

任何帮助/指针将不胜感激!!

        /*
     * 
     * Pig Code:
     * register '/basepath/udf/DIF.jar'
    rel1 = LOAD '/user/home/test' USING USING TextLoader();
    rel2 = FOREACH rel1 GENERATE StripNonPrintable(s) as recordline;
    dump rel2;

     * 
     */

  //Imports    

    public class StripNonPrintable extends EvalFunc<String>
    {
         public String exec(Tuple input) throws IOException {
             if (input == null || input.size() == 0)
                 return null;
             try{

                    String s = new String();
                     s = (String)input.get(0);
                    //s = "2001-12-20-08.45.08.169176^2001-12-20-08.45.08.131408^597^0^57^ZUCKA^Grase^^^Grase,Dr^^^N^N^N^Dr^KG^ONLY INFORMATION ENTERED^UNKNOWN^0     ^      ^^^6785790362�^0^^^^^^0^Grase,Dr^^^, ,^^^^^^597^^^<fnm>DR</fnm><lnm>GRASE</lnm>^^^^^^^^SINGLE^0^0";

                    int length = s.length();
                    char[] oldChars = new char[length];
                    s.getChars(0, length, oldChars, 0);
                    int newLen = 0;
                    for (int j = 0; j < length; j++) {
                        char ch = oldChars[j];
                        if (ch < 0x80  ) {
                            oldChars[newLen] = ch;
                            newLen++;
                        }
                    }
                    s = new String(oldChars, 0, newLen);

                    //System.out.println("New String = \n " + s);

                    return s;
             }catch(Exception e){
                 return null ;
             }
         }

     }

共有1个答案

林龙野
2023-03-14

java.lang.character。有一个函数gettype,该函数:

返回一个值,该值指示字符的一般类别

导入java.lang.character并替换:

if (ch < 0x80  )
int c = Character.getType(ch);
if(c != Character.CONTROL || 
            c != Character.CONNECTOR_PUNCTUATION || 
            c != Character.CURRENCY_SYMBOL || 
            c != Character.DASH_PUNCTUATION || 
            c != Character.DECIMAL_DIGIT_NUMBER || 
            c != Character.ENCLOSING_MARK || 
            c != Character.END_PUNCTUATION || 
            c != Character.FINAL_QUOTE_PUNCTUATION || 
            c != Character.INITIAL_QUOTE_PUNCTUATION || 
            c != Character.LETTER_NUMBER || 
            c != Character.LOWERCASE_LETTER || 
            c != Character.MATH_SYMBOL || 
            c != Character.MODIFIER_LETTER || 
            c != Character.MODIFIER_SYMBOL || 
            c != Character.OTHER_LETTER || 
            c != Character.OTHER_NUMBER || //remove it if you want to get rid of ½ 
            c != Character.OTHER_PUNCTUATION || 
            c != Character.OTHER_SYMBOL || 
            c != Character.START_PUNCTUATION || 
            c != Character.TITLECASE_LETTER || 
            c != Character.UPPERCASE_LETTER)
 类似资料:
  • 使用getID3,有时标签中有特殊字符(带问号的小黑钻),但我似乎无法删除它们 我尝试了这里的一切 PHP:如何删除字符串中所有不可打印的字符? 在数据库(phpMyAdmin)中,当打印出来时,它们显示为??在数据的开头。 问题是,我根本不希望这些字符出现在数据库中(无论它们是否正确显示或显示为问号) 但是,我尝试过的所有代码都不会删除PHP中的这些特殊字符

  • 问题内容: 我得到的用户输入包括非ASCII字符和不可打印的字符,例如 例如: 所需的输出: 使用Java删除它们的最佳方法是什么? 我尝试了以下操作,但似乎不起作用 输出量 问题答案: 您的要求不清楚。Java 中的所有字符都是Unicode字符,因此,如果将其删除,将留下一个空字符串。我假设您的意思是您要删除任何非ASCII,不可打印的字符。 此处, 代表可打印ASCII字符的POSIX字符类

  • 我想我需要删除字符0-31和127。 是否有一个函数或一段代码来高效地做到这一点?

  • 问题内容: 我想我需要删除0-31和127字符, 是否有功能或一段代码可以有效地做到这一点。 问题答案: 7位ASCII? 如果您的Tardis刚好在1963年登陆,并且您只想要7位可打印的ASCII字符,则可以使用以下方法从0-31和127-255中删除所有内容: 它匹配0-31、127-255范围内的任何内容并将其删除。 8位扩展ASCII? 您掉进了热水浴缸计时机,而您又回到了八十年代。如果

  • 问题内容: 我正在用Python编写程序,并希望将终端中打印的最后一个字符替换为另一个字符。 伪代码为: 我正在使用Windows8 OS,Python 2.7和常规解释器。 到目前为止,我看到的所有选项都不适合我。(例如:,(#为1),)。 这些选项是在其他Stack Overflow问题或其他资源中提出的,似乎对我不起作用。 编辑 :也使用不会改变影响。它只是不会擦除最后打印的字符。相反,使用

  • 使用绘制时,删除网格线的标准方法似乎是徒劳的。 例如,如果我们绘制一个简单的< code>ggplot对象,这将删除网格 回报 但是当您使用绘制时,相同的代码无法删除网格