gpt4 book ai didi

java - 多次读取包含相同条目的文件,但只想更改其中一个条目

转载 作者:行者123 更新时间:2023-12-02 09:44:50 26 4
gpt4 key购买 nike

BufferedReader 正在浏览一个包含各种的文件,这些行都包含特定的标识符(所谓的 qdr)。 qdr 包含特定金额。该金额可以手动减少。当减少数量时,BufferedReader 会遍历文件并检查包含特定 qdr 的行。

它应该做的是仅在它发现的包含该 qdr 的第一行中更改该金额,并且仅当减少的金额大于特定行的规定金额(金额 < 1)时,才应该从由相同 qdr 标识的下一行中减少该金额。

我希望我能澄清我的问题。非常感谢您的帮助!

通过 bufferedreader 检查文件是否包含给定的 qdr。如果是这种情况,则会将给定量添加到该行之一。但是,正如您在代码中看到的,它正在对包含该 qdr 的所有行执行此操作。我的想法是用循环逐行检查每一行是否包含该 qdr,如果不是这种情况,则转到下一行,如果是这种情况,请查看之后金额是否 > 0随新金额而改变。如果没有,则查找包含该 qdr 的下一行并执行相同操作。不幸的是,这就是我挣扎的地方。

  public static void removeDB(String qdr, int amount, String editor, String date) {            
File readFile = new File(databaseRead);
File writeFile = new File(databaseWrite);
// creating the line variable to read through lines in while loop
String line = null;
// go through file
try {
// create FileReader which reads the file
FileReader fileReader = new FileReader(readFile);
// wrap the FileReader into BufferedReader
BufferedReader buffRead = new BufferedReader(fileReader);
// FileWriter to write lines into new file
FileWriter writer = new FileWriter(writeFile);
BufferedWriter buffWrite = new BufferedWriter(writer);

// go through all lines
while ((line = buffRead.readLine()) != null) {

if (line.contains(qdr)) {
// set the amount
String blankSpaceAmount = clearOutput.split(", ")[3];
// setting new Amount
int remainingAmount = Integer.parseInt(blankSpaceAmount) - amount;

// if amount is bigger than 0, show qdr in DB with new amount
if (remainingAmount > 0) {
// set the remaining Amount to String to show it in text field in Remove GUI
remAmount = String.valueOf(remainingAmount);
// read line and replace the current amount String with remaining amount String
String amountReplacement = line.replaceAll(blankSpaceAmount, remAmount);
}

最佳答案

您可以做的一件事是使用 boolean 标志,以指示您已修改第一个遇到的qdr,也许将其命名为qdrChanged。在 while 循环上方声明它并将其初始化为 false:

boolean qdrChanged = false;

然后在 while 循环中:

// go through all lines
while ((line = buffRead.readLine()) != null) {
if (line.contains(qdr) && !qdrChanged) {
// set the amount but only if this hasn't been done already.
String blankSpaceAmount = clearOutput.split(", ")[3];
// setting new Amount
int remainingAmount = Integer.parseInt(blankSpaceAmount) - amount;

// if amount is bigger than 0, show qdr in DB with new amount
if (remainingAmount > 0) {
// set the remaining Amount to String to show it in text field in Remove GUI
remAmount = String.valueOf(remainingAmount);
// read line and replace the current amount String with remaining amount String
String amountReplacement = line.replaceAll(blankSpaceAmount, remAmount);
}
// .... The rest of code for the: if (line.contains(qdr) && !qdrChanged) { code block ....

qdrChanged = true; // Flag that qdr has been modified

} // END of Code block for: if (line.contains(qdr) && !qdrChanged) {

// The rest of your WHILE loop code
}

无论如何,有这样的效果。

无论你做什么,不要使用break;来跳出循环。这也将停止写入新文件。

在使用Integer.parseInt()之前,验证提供给该方法的字符串,以避免出现NumberFormatException的可能性:

/* If blankSpaceAmount is NOT a valid signed or unsigned
integer value then make it a default value like 0 or
String.valueOf(amount) or whatever.
*/
if (!blankSpaceAmount.matches("-?\\d+") {
blankSpaceAmount = "0"; // or throw a message or an exception if you like.
}
int remainingAmount = Integer.parseInt(blankSpaceAmount) - amount;

关于java - 多次读取包含相同条目的文件,但只想更改其中一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56742409/

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