gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:50:13 26 4
gpt4 key购买 nike

我有一个 TransferReader 类,它使用以下形式读取包含从银行帐户到另一个帐户的转账数据的文件:

发送者帐户 ID、接收者帐户 ID、金额、转账日期

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

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

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

我使用 BufferedReader 读取每一行,然后使用 String.split(",")< 将每个元素拆分为 String[]/strong> 作为分隔符。

最佳答案

正如已经意识到的,因为发送者帐户 ID接收者帐户 ID 彼此相邻在记录中,没有真正的方法可以知道哪个 ID 可能丢失,除非分隔符保留在其位置指示 Null 值。然而,有一些机制可以确定它确实是缺失的两个之一,哪一个需要通过用户审查来执行,即使这样,可能还不够好。其他记录列字段(如金额转账日期)可以轻松验证,或者如果缺失,可能会涉及到特定的文件数据状态日志

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

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;
}
}

我不太确定您的特定应用程序进程最终会带来什么,但如果其他进程正在访问该文件并对其进行修改,那么可能明智地使用锁定 锁定文件并在完成时解锁文件的strong>机制。然而,这很可能需要您使用不同的读取算法,因为锁定文件必须通过可写 channel 完成。使用FileChannelFileLock java.nio 包中的类可能会在这里为您提供帮助。 StackOverflow 论坛中有如何使用这些类的示例。

关于java - 检查文件内容中缺少哪个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59093402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com