检查文本文件中的每一行数据并识别无效数据

时间:2017-12-01 02:44:58

标签: java

所以我环顾四周,找不到与我想要完成的任何事情有关的任何事情,所以我在这里问你们有些人,如果你们是我会帮忙的。我是一名大学生,我正在努力绕过一项特殊的任务。

任务围绕以下内容进行:

  • 能够让我们开发的程序检查我们输入的文件中的每一行数据,并通过消息向控制台报告任何错误(例如缺少数据)。

我目前正在使用Scanner扫描文件,而.split则在找到的每个连字符处拆分文本,然后将该数据放入String [] splitText数组中......代码如下:

File Fileobject = new File(importFile);
Scanner fileReader = new Scanner(Fileobject);
while(fileReader.hasNext())
{
    String line = fileReader.nextLine();
    String[] splitText = line.split("-");
}

我们正在扫描的文件中包含的文字格式如下:

 Title - Author - Price - Publisher - ISBN

标题,作者和出版商的长度各不相同 - 而ISBN是11个字符,价格是两位小数。我能够轻松地将有效数据打印到控制台,尽管它有整个验证和打印错误(例如:"书名可能丢失。")到我的控制台头扭曲。

IF语句是否适合检查每行数据?如果是这样,那将如何构建?

3 个答案:

答案 0 :(得分:0)

是的,你最好的选择是使用if语句(我想不出另一种方式?)。为了清洁,我建议您创建validateData(String data)方法或多个验证器函数。

例如,因为您知道每一行都将采用标题 - 作者 - 价格 - 出版商 - ISBN格式,您可以编写如下代码:

public void validatePrice(String data) {
  //Write your logic to validate. 
}
public void validateAuthor(String data) {
  //Write your logic to validate. 
}
...

然后在你的while循环中你可以调用

validatePrice([splitText[0]);
validateAuthor([splitText[1]);

用于每个验证方法。

根据您的需要,您可以将此更多的OOP风格转变,但这是一种清晰的方式。

答案 1 :(得分:0)

如果要检查五列中每一列的长度/存在,请考虑以下事项:

while (fileReader.hasNext()) {
    String line = fileReader.nextLine();
    String[] splitText = line.split("-");
    if (splitText.length < 5) {
        System.out.println("One or more columns is entirely missing.");
        continue;     // skip this line
    }
    if (splitText[0].length == 0) {
        System.out.println("Title is missing")
    }
    if (splitText[1].length == 0) {
        System.out.println("Author is missing")
    }
    boolean isValidPrice = true;
    try {
        Double.parseDouble(splitText[2]);
    }
    catch (Exception e) {
        isValidPrice = false;
    }
    if (!isValidPrice) {
        System.out.println("Found an invalid price " + splitText[2] + " but expected a decimal.");
    }
    if (splitText[4].length != 11) {
        System.out.println("Found an invalid ISBN.");
    }

我上面做了两级验证。如果在破折号上拆分当前行不会产生5个术语,那么我们缺少列,我们甚至不会猜测实际上可能存在哪些数据。如果有5个预期列,那么我们按长度和/或预期值对每个字段进行验证。

答案 2 :(得分:0)

您要检查验证的第一件事是您有适当数量的条目(在这种情况下检查数组的大小是否为5),之后,您要检查每个数据

如果陈述是一个好方法,你可以做一些简单的事情:

if(title.isBad()) print("error");
if(author.isBad()) print("error");
if(price.isBad()) print("error");
if(publisher.isBad()) print("error");
if(isbn.isBad()) print("error");

替换正在检查的子句的.isBad,例如string [i] .isEmpty(),ISBN的长度等。

对于需要更长时间检查的产品,例如价格,您将要制作一些嵌套的for循环,检查它是否包含句点,仅包含数字,并且&#39; y后有2位数字期间。

有用的东西是原始数据类型的Wrapper类,如果允许你这样做

Character.isLetter(strings[i].charAt[j])

代替

(strings[i].charAt[j] >= 'A' && strings[i].charAt[j] <= 'Z') &&
(strings[i].charAt[j] >= 'a' && strings[i].charAt[j] <= 'z')

try{
    Double.parseDouble(strings[i]);
}

而不是手动检查价格。

希望这有帮助!