确定缺失的数据

时间:2012-02-04 13:30:05

标签: java

我有文字文件。它包含每行中的分隔数据,如

120 US 1 ALASKA 4.

在某些行中缺少一些数据。喜欢,

US 1 ALASKA 4

由于它是由空格分隔的,我使用split来获取令牌。我无法确定缺少哪些数据。

在下面的代码中,示例input1将验证120的{​​{1}}。如果该行中缺少^[1-9]+$,如示例120input2token[0],它将验证US并给{{1} }}。而不是这个,我想知道缺少哪个值。因此,我可以显示错误^[1-9]+$,而"Error in a"应该包含"Error a i missing",以便我可以正确验证。

有人可以就上述做法提出一些建议吗?

token[1]

4 个答案:

答案 0 :(得分:0)

你可以像下面这样(考虑到你有四个元素),你的模式是数字字符串数字串号

if (firstdata is not a number & firstdata is String) {
    //display alert as first data is missing
    // move the token data
    e=d;
    d=c;
    c=b;
    b=a;
}

为第二名数据做同样的事情......等等......

确定缺少的内容,您将不得不移动数据......

更新1

以下是我的意思....这是经过测试和验证的代码,适用于您提供的两个输入..

public class checkForPattern {
    public static void main(String[] args) {

        String line = "120 US 1 ALASKA 4"; // Sample input1
        // String line = "US 1 ALASKA 4"; //Sample input2
        String delimiter = "[ ]+";
        String tokens[] = line.split(delimiter);

        String a = "", b = "", c = "", d = "", e = "";
        try {
            a = tokens[0];
            b = tokens[1];
            c = tokens[2];
            d = tokens[3];
            e = tokens[4];
        } catch (Exception e1) {
        }

        System.out.println("String is : " + line);
        // Sample validation
        if (a.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+")) {
            System.out.println("Position First Matches.");
        } else {
            System.out.println("Error in first position.");
            e = d;
            d = c;
            c = b;
            b = a;
        }

        if (!(b.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+"))) {
            System.out.println("Position Two Matches.");
        } else {
            System.out.println("Error in second position.");
            e = d;
            d = c;
            c = b;
        }

        if (c.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+")) {
            System.out.println("Position Three Matches.");
        } else {
            System.out.println("Error in third position.");
            e = d;
            d = c;
        }

        if (!(d.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+"))) {
            System.out.println("Position Four Matches.");
        } else {
            System.out.println("Error in fourth position.");
            e = d;
        }

        if (e.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+")) {
            System.out.println("Position Five Matches.");
        } else {
            System.out.println("Error in fifth position.");
            e = d;
            d = c;
        }

    }
}

答案 1 :(得分:0)

我会尝试以下方法:

  • 将一行划分为令牌。
  • 分析每个标记以确定它可能属于的位置(字符串只能位于第2或第4位,I或1,3或5位。长字符串必须位于第5位...
  • 由于令牌的位置必须增加,您可以确定可能丢失的令牌。

答案 2 :(得分:0)

这是星期六!让我们为您编写一个方法,假设模式为<number> <2char> <number> <a_word> <number>,您可以更改模式。这很简单。

public static boolean validate(String line){
     String delimiter = "[\\s]+";
     String[] tokens = line.split(delimiter);
     int i=0;
     for(String s: tokens){
         switch (i) {
            case 0:
                if(!s.matches("\\d+")) throw new IllegalArgumentException("First element missing");
                break;

            case 1:
                if(!s.matches("\\w{2}")) throw new IllegalArgumentException("2nd element missing");
                break;

            case 2:
                if(!s.matches("\\d+")) throw new IllegalArgumentException("3rd element missing");
                break;

            case 3:
                if(!s.matches("\\w+")) throw new IllegalArgumentException("4th element missing");
                break;

            case 4:
                if(!s.matches("\\d+")) throw new IllegalArgumentException("5th element missing");
                break;

        }
         i++;
     }

     if(i<4)throw new IllegalArgumentException((i+1)+" element missing");
     return true;
}

如果你不符合我的口味,你宁愿返回false我抛出异常的地方。

答案 3 :(得分:0)

对于这样的语法,我认为使用Scanner会做得更好。例如(您需要检查方法名称,参数类型等)

    String line = "120 US 1 ALASKA 4";
    Scanner scanner = new Scanner(line);
    scanner.useDelimiter(" +"); // set the field delimiter regex.
    int value1, value2, value3;

PARSE: 
    try {
        value1 = scanner.nextInt();
        if (!scanner.next().equals("USA")) {
            ...
            break PARSE; // or throw ...
        }
        value2 = scanner.nextInt();
        if (!scanner.next().equals("ALASKA")) {
            ...
            break PARSE; // or throw ...
        }
        value3 = scanner.nextInt();
    } catch (NoSuchElementException ex) {
        ...
    }

如果缺少其中一个字段,那么您将在预期整数的位置获得非整数(因此NoSuchElementException)或其中一个调用next()将返回错误的标记字符串,equals测试将失败。