чтение файла, который содержит одни и те же записи несколько раз, но хочет изменить только одну из этих записей - PullRequest
0 голосов
/ 24 июня 2019

BufferedReader просматривает файл, который содержит различные строки , которые все содержат определенный идентификатор (так называемый qdr) .Qdr содержит определенное количество.Эта сумма может быть уменьшена вручную.При уменьшении суммы BufferedReader просматривает файл и проверяет строки, содержащие определенный qdr.

Что нужно сделать, это изменить эту сумму только в первой найденной строке, содержащей этот qdr, и только в том случае, если уменьшена сумма, превышающая указанную сумму конкретной строки (сумма <1),тогда он должен уменьшить эту сумму со следующей строки, которая обозначена тем же самым qdr. </p>

Я надеюсь, что смогу прояснить свои проблемы.Большое спасибо за вашу помощь!

Посредством буферизированного читателя проверяется, содержит ли файл заданный 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);
        }

1 Ответ

1 голос
/ 24 июня 2019

Одна вещь, которую вы можете сделать, это использовать логический флаг, чтобы указать, что вы изменили первый встреченный 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...