检查文件内容中缺少哪个参数

我有一个 TransferReader 类,该类使用以下格式将文件从银行帐户读取到另一个帐户:

SenderaccountID,ReceiveraccountID,Amount,TransferDate

"473728292,474728298,1500.00,2019-10-17 12:34:12"(未修改的字符串)

假设文件在读取之前已被修改,因此上述参数之一丢失,我想检查其中哪些丢失。

"474728298,2019-10-17 12:34:12"(修改后的字符串)

我正在使用 BufferedReader 读取每一行,然后使用 String.split(“,”) 作为分隔符。

yxj7078 回答:检查文件内容中缺少哪个参数

已经意识到,因为 发件人帐户ID 收件人帐户ID 在记录中,除非有分隔符保留在指示Null值的位置,否则没有真正的方法可以知道哪个ID可能丢失。但是,有可用的机制来确定确实是缺少的两种机制之一,这需要通过用户审查来进行,即使那样,可能可能还不够好。其他记录列字段,例如 金额 转帐日期 ,可以轻松地进行验证,或者如果缺少则可以暗示特定的文件数据状态日志

下面是一些代码,该代码将读取数据文件(名为Data.csv)并将潜在的数据行(记录)错误记录到列表接口对象中,该对象将在读取完成后循环并显示在控制台窗口中。还有一些小的辅助方法。这是代码:

private void checkDataFile(String filePath) {
    String ls = System.lineSeparator();
    List<String> validationFailures = new ArrayList<>();
    StringBuilder sb = new StringBuilder();

    // 'Try With Resources' used here to auto-close reader.
    try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
        String line;
        int lineCount = 0;
        // Read the file line-by-line.
        while ((line = reader.readLine()) != null) {
            line = line.trim();
            lineCount++;
            if (lineCount == 1 || line.equals("")) {
                continue;
            }
            sb.delete(0,sb.capacity()); // Clear the StringBuilder object

            // Start the Status Log
            sb.append("File Line Number: ").append(lineCount)
                    .append(" (\"").append(line).append("\")").append(ls);
            // Split line into an Array based on a comma delimiter
            // reguardless of the delimiter's spacing situation.
            String[] lineParts = line.split("\\s{0,},\\s{0,}");
            /* Validate each file line. Log any line that fails
               any validation for any record column data into a
               List Interface object named: validationFailures
             */
            // Are there 4 Columns of data in each line...
            if (lineParts.length < 4) {
                sb.append("\t- Invalid Column Count!").append(ls);
                // Which column is missing...
                // *** You may need to add more conditions to suit your needs. ***
                if (checkAccountIDs(lineParts[0]) && lineParts.length >= 2 && !checkAccountIDs(lineParts[1])) {
                    sb.append("\t- Either the 'Sender Account ID' or the "
                            + "'ReceiverAccountID' is missing!").append(ls);
                }
                else if (lineParts.length >= 3 && !checkAmount(lineParts[2])) {
                    sb.append("\t- The 'Amount' value is missing!").append(ls);
                }
                else if (lineParts.length < 4) {
                    sb.append("\t- The 'Transfer Date' is missing!").append(ls);
                }
            }
            else {
                // Is SenderAccountID data valid...
                if (!checkAccountIDs(lineParts[0])) {
                    sb.append("\t- Invalid Sender Account ID in column 1! (")
                            .append(lineParts[0].equals("") ? "Null" : 
                                    lineParts[0]).append(")");
                    if (lineParts[0].length() < 9) {
                        sb.append(" <-- Not Enough Or No Digits!").append(ls);
                    }
                    else if (lineParts[0].length() > 9) {
                        sb.append(" <-- Too Many Digits!").append(ls);
                    }
                    else {
                        sb.append(" <-- Not All Digits!").append(ls);
                    }
                }
                // Is ReceiverAccountID data valid...
                if (!checkAccountIDs(lineParts[1])) {
                    sb.append("\t- Invalid Receiver Account ID in coloun 2! (")
                            .append(lineParts[1].equals("") ? "Null" : 
                                    lineParts[1]).append(")");
                    if (lineParts[1].length() < 9) {
                        sb.append(" <-- Not Enough Or No Digits!").append(ls);
                    }
                    else if (lineParts[1].length() > 9) {
                        sb.append(" <-- Too Many Digits!").append(ls);
                    }
                    else {
                        sb.append(" <-- Not All Digits!").append(ls);
                    }
                }
                // Is Amount data valid...
                if (!checkAmount(lineParts[2])) {
                    sb.append("\t- Invalid Amount Value in column 3! (")
                            .append(lineParts[2].equals("") ? "Null" : 
                                    lineParts[2]).append(")").append(ls);
                }
                // Is TransferDate data valid...
                if (!checkTransferDate(lineParts[3],"yyyy-MM-dd HH:mm:ss")) {
                    sb.append("\t- Invalid Transfer Date Timestamp in column 4! (")
                            .append(lineParts[3].equals("") ? "Null" : 
                                    lineParts[3]).append(")").append(ls);
                }
            }
            if (!sb.toString().equals("")) {
                validationFailures.add(sb.toString());
            }
        }
    }
    catch (FileNotFoundException ex) {
        System.err.println(ex.getMessage());
    }
    catch (IOException ex) {
        System.err.println(ex.getMessage());
    }

    // Display the Log...
    String timeStamp = new SimpleDateFormat("yyyy/MM/dd - hh:mm:ssa").
            format(new Timestamp(System.currentTimeMillis()));
    String dispTitle = "File Data Status at " + timeStamp.toLowerCase() 
                     + " <:-:> (" + filePath + "):";
    System.out.println(dispTitle + ls + String.join("",Collections.nCopies(dispTitle.length(),"=")) + ls);
    if (validationFailures.size() > 0) {
        for (String str : validationFailures) {
            if (str.split(ls).length > 1) {
                System.out.println(str);
                System.out.println(String.join("",Collections.nCopies(80,"-")) + ls);
            }
        }
    }
    else {
        System.out.println("No Issues Detected!" + ls); 
    } 
}

private boolean checkAccountIDs(String accountID) {
    return (accountID.matches("\\d+") && accountID.length() == 9);
}

private boolean checkAmount(String amount) {
    return amount.matches("-?\\d+(\\.\\d+)?");
}

private boolean checkTransferDate(String transferDate,String format) {
    return isValidDateString(transferDate,format);
}

private boolean isValidDateString(String dateToValidate,String dateFromat) {
    if (dateToValidate == null || dateToValidate.equals("")) {
        return false;
    }
    SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
    sdf.setLenient(false);
    try {
        // If not valid,it will throw a ParseException
        Date date = sdf.parse(dateToValidate);
        return true;
    }
    catch (ParseException e) {
        return false;
    }
}

我不确定您的特定应用程序最终将要包含什么内容,但是如果其他进程正在访问文件并对其进行修改,则可能明智地利用锁定当您在特定过程中 Lock 锁定文件并在完成后 Unlock 锁定文件。但是,这很可能需要您使用其他读取算法,因为锁定文件必须通过 可写 通道来完成。使用 java.nio 包中的FileChannelFileLock类可能在这里为您提供帮助。在StackOverflow论坛中将有一些示例,说明如何利用这些类。

本文链接:https://www.f2er.com/3012249.html

大家都在问