Skip to Main Content

New to Java

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Need Help With File Matching Records

807598Sep 7 2006 — edited Sep 11 2006
I need help with my file matching program.
Here is how it suppose to work: FileMatch class should contain methods to read oldmast.txt and trans.txt. When a match occurs (i.e., records with the same account number appear in both the master file and the transaction file), add the dollar amount in the transaction record to the current balance in the master record, and write the "newmast.txt" record. (Assume that purchases are indicated by positive amounts in the transaction file and payments by negative amounts.)
When there is a master record for a particular account, but no corresponding transaction record, merely write the master record to "newmast.txt". When there is a transaction record, but no corresponding master record, print to a log file the message "Unmatched transaction record for account number ..." (fill in the account number from the transaction record). The log file should be a text file named "log.txt".

--------------------------------------------------------------------------------------------------
Here is my following program code:
// Exercise 14.8: CreateTextFile.java
// creates a text file
import java.io.FileNotFoundException;
import java.lang.SecurityException;
import java.util.Formatter;
import java.util.FormatterClosedException;
import java.util.NoSuchElementException;
import java.util.Scanner;

import org.egan.AccountRecord;
import org.egan.TransactionRecord;

public class CreateTextFile
{
  private Formatter output1;  // object used to output text to file
  private Formatter output2;  // object used to output text to file

  // enable user to open file
  public void openTransFile()
  {
    try
    {
      output1 = new Formatter("trans.txt");
    }
    catch (SecurityException securityException)
    {
      System.err.println("You do not have write access to this file.");
      System.exit(1);
    } // end catch
    catch (FileNotFoundException filesNotFoundException)
    {
      System.err.println("Error creating file.");
      System.exit(1);
    }
  } // end method openTransFile

  // enable user to open file
  public void openOldMastFile()
  {
    try
    {
      output2 = new Formatter("oldmast.txt");
    }
    catch (SecurityException securityException)
    {
      System.err.println("You do not have write access to this file.");
      System.exit(1);
    } // end catch
    catch (FileNotFoundException filesNotFoundException)
    {
      System.err.println("Error creating file.");
      System.exit(1);
    }
  } // end method openOldMastFile

  // add transaction records to file
  public void addTransactionRecords()
  {
    // object to be written to file
    TransactionRecord record1 = new TransactionRecord();
 
    Scanner input1 = new Scanner(System.in);

    System.out.printf("%s\n%s\n%s\n%s\n\n",
      "To terminate input, type the end-of-file indicator",    
      "when you are prompted to enter input.",
      "On UNIX/Linux/Mac OS X type <ctrl> d then press Enter",
      "On Windows type <ctrl> z then press Enter");

    System.out.printf("%s\n%s",
       "Enter account number (> 0) and amount.","? ");

    while (input1.hasNext())  // loop until end-of-file indicator
    {
      try // output values to file 
      {
        // retrieve data to be output
        record1.setAccount(input1.nextInt());    // read account number
        record1.setAmount(input1.nextDouble());  // read amount

        if (record1.getAccount() > 0)
        {
          // write new record
          output1.format("%d %.2f\n", record1.getAccount(), record1.getAmount());
        } // end if
        else
        {
          System.out.println("Account number must be greater than 0.");
        } // end else
      } // end try
      catch (FormatterClosedException formatterClosedException)
      {
        System.err.println("Error writing to file.");
        return;
      } // end catch
      catch (NoSuchElementException elementException)
      {
        System.err.println("Invalid input. Please try again.");
        input1.nextLine(); // discard input so user can try again
      } // end catch

      System.out.printf("%s %s\n%s", "Enter account number (> 0) ",
        "and amount.","? ");
    } // end while
  } // end method addTransactionRecords

  // add account records to file
  public void addAccountRecords()
  {
    // object to be written to file
    AccountRecord record2 = new AccountRecord();
    
    Scanner input2 = new Scanner(System.in);

    System.out.printf("%s\n%s\n%s\n%s\n\n",
      "To terminate input, type the end-of-file indicator",    
      "when you are prompted to enter input.",
      "On UNIX/Linux/Mac OS X type <ctrl> d then press Enter",
      "On Windows type <ctrl> z then press Enter");

    System.out.printf("%s\n%s",
       "Enter account number (> 0), first name, last name and balance.","? ");

    while (input2.hasNext())  // loop until end-of-file indicator
    {
      try // output values to file 
      {
        // retrieve data to be output
        record2.setAccount(input2.nextInt());    // read account number
        record2.setFirstName(input2.next());      // read first name
        record2.setLastName(input2.next());       // read last name
        record2.setBalance(input2.nextDouble());  // read balance

        if (record2.getAccount() > 0)
        {
          // write new record
          output2.format("%d %s %s %.2f\n", record2.getAccount(), record2.getFirstName(),
            record2.getLastName(), record2.getBalance());
        } // end if
        else
        {
          System.out.println("Account number must be greater than 0.");
        } // end else
      } // end try
      catch (FormatterClosedException formatterClosedException)
      {
        System.err.println("Error writing to file.");
        return;
      } // end catch
      catch (NoSuchElementException elementException)
      {
        System.err.println("Invalid input. Please try again.");
        input2.nextLine(); // discard input so user can try again
      } // end catch

      System.out.printf("%s %s\n%s", "Enter account number (> 0),",
        "first name, last name and balance.","? ");
    } // end while
  } // end method addAccountRecords

  // close file
  public void closeTransFile()
  {
    if (output1 != null)
      output1.close();
  } // end method closeTransFile

  // close file
  public void closeOldMastFile()
  {
    if (output2 != null)
      output2.close();
  } // end method closeOldMastFile
} // end class CreateTextFile
--------------------------------------------------------------------------------------------------
// Exercise 14.8: CreateTextFileTest.java
// Testing class CreateTextFile

public class CreateTextFileTest
{
   // main method begins program execution
   public static void main( String args[] )
   { 
     CreateTextFile application = new CreateTextFile();
     application.openTransFile();
     application.addTransactionRecords();
     application.closeTransFile();

     application.openOldMastFile();
     application.addAccountRecords();
     application.closeOldMastFile();
   } // end main

} // end class CreateTextFileTest
-------------------------------------------------------------------------------------------------
// Exercise 14.8: TransactionRecord.java
// A class that represents on record of information
package org.egan; // packaged for reuse

public class TransactionRecord
{
  private int account;
  private double amount;

  // no-argument constructor calls other constructor with default values
  public TransactionRecord()
  {
    this(0,0.0); // call two-argument constructor
  } // end no-argument AccountRecord constructor

  // initialize a record
  public TransactionRecord(int acct, double amt)
  {
    setAccount(acct);
    setAmount(amt);
  } // end two-argument TransactionRecord constructor

  // set account number
  public void setAccount(int acct)
  {
    account = acct;
  } // end method setAccount

  // get account number
  public int getAccount()
  {
    return account;
  } // end method getAccount

  // set amount
  public void setAmount(double amt)
  {
    amount = amt;
  } // end method setAmount

  // get amount
  public double getAmount()
  {
    return amount;
  } // end method getAmount

} // end class TransactionRecord 
-------------------------------------------------------------------------------------------------
// Exercise 14.8: AccountRecord.java
// A class that represents on record of information
package org.egan; // packaged for reuse
import org.egan.TransactionRecord;

public class AccountRecord
{
  private int account;
  private String firstName;
  private String lastName;
  private double balance;

  // no-argument constructor calls other constructor with default values
  public AccountRecord()
  {
    this(0,"","",0.0); // call four-argument constructor
  } // end no-argument AccountRecord constructor

  // initialize a record
  public AccountRecord(int acct, String first, String last, double bal)
  {
    setAccount(acct);
    setFirstName(first);
    setLastName(last);
    setBalance(bal);
  } // end four-argument AccountRecord constructor

  // set account number
  public void setAccount(int acct)
  {
    account = acct;
  } // end method setAccount

  // get account number
  public int getAccount()
  {
    return account;
  } // end method getAccount

  // set first name
  public void setFirstName(String first)
  {
    firstName = first;
  } // end method setFirstName

  // get first name
  public String getFirstName()
  {
    return firstName;
  } // end method getFirstName

  // set last name
  public void setLastName(String last)
  {
    lastName = last;
  } // end method setLastName

  // get last name
  public String getLastName()
  {
    return lastName;
  } // end method getLastName

  // set balance
  public void setBalance(double bal)
  {
    balance = bal;
  } // end method setBalance

  // get balance
  public double getBalance()
  {
    return balance;
  } // end method getBalance

  // combine balance and amount
  public void combine(TransactionRecord record)
  {
    balance = (getBalance() + record.getAmount());  
  } // end method combine
  

} // end class AccountRecord 
-------------------------------------------------------------------------------------------------
// Exercise 14.8: FileMatch.java
import java.io.File;
import java.io.FileNotFoundException;
import java.lang.IllegalStateException;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.Formatter;
import java.util.FormatterClosedException;

import org.egan.AccountRecord;
import org.egan.TransactionRecord;

public class FileMatch
{
  private Scanner inTransaction;
  private Scanner inOldMaster;
  private Formatter outNewMaster; 
  private Formatter theLog;

  // enable user to open file
  public void openTransFile()
  {
    try
    {
      inTransaction = new Scanner(new File("trans.txt"));
    } // end try
    catch (FileNotFoundException fileNotFoundException)
    {
      System.err.println("Error opening file.");
      System.exit(1);
    } // end catch
  } // end method openTransFile


  // enable user to open file
  public void openOldMastFile()
  {
    try
    {
      inOldMaster = new Scanner(new File("oldmast.txt"));
    } // end try
    catch (FileNotFoundException fileNotFoundException)
    {
      System.err.println("Error opening file.");
      System.exit(1);
    } // end catch
  } // end method openOldMastFile


  // enable user to open file
  public void openNewMastFile()
  {
    try
    {
      outNewMaster = new Formatter("newmast.txt");
    }
    catch (SecurityException securityException)
    {
      System.err.println("You do not have write access to this file.");
      System.exit(1);
    } // end catch
    catch (FileNotFoundException filesNotFoundException)
    {
      System.err.println("Error creating file.");
      System.exit(1);
    }
  } // end method openNewMastFile


  // enable user to open file
  public void openLogFile()
  {
    try
    {
      theLog = new Formatter("log.txt");
    }
    catch (SecurityException securityException)
    {
      System.err.println("You do not have write access to this file.");
      System.exit(1);
    } // end catch
    catch (FileNotFoundException filesNotFoundException)
    {
      System.err.println("Error creating file.");
      System.exit(1);
    }
  } // end method openLogFile


  // update records
  public void updateRecords()
  {
    TransactionRecord transaction = new TransactionRecord();
    AccountRecord account = new AccountRecord();

    try // read records from file using Scanner object
    {
      System.out.println("Start file matching.");
      while (inTransaction.hasNext() && inOldMaster.hasNext())
      {
        transaction.setAccount(inTransaction.nextInt());     // read account number
        transaction.setAmount(inTransaction.nextDouble());   // read amount
        
        account.setAccount(inOldMaster.nextInt());     // read account number
        account.setFirstName(inOldMaster.next());      // read first name  
        account.setLastName(inOldMaster.next());       // read last name
        account.setBalance(inOldMaster.nextDouble());  // read balance

        if (transaction.getAccount() == account.getAccount()) 
        {
          while (inTransaction.hasNext() && transaction.getAccount() == account.getAccount())
          {
            account.combine(transaction);
            outNewMaster.format("%d %s %s %.2f\n",
            account.getAccount(), account.getFirstName(), account.getLastName(),
            account.getBalance());
            transaction.setAccount(inTransaction.nextInt());     // read account number
            transaction.setAmount(inTransaction.nextDouble());   // read amount
          }       
        }
        else if (transaction.getAccount() != account.getAccount())
        {
          outNewMaster.format("%d %s %s %.2f\n",
          account.getAccount(), account.getFirstName(), account.getLastName(),
          account.getBalance());          
          theLog.format("%s%d","Unmatched transaction record for account number ",transaction.getAccount());
        }
      } // end while
      System.out.println("Finish file matching.");
    } // end try
    catch (NoSuchElementException elementException)
    {
      System.err.println("File improperly formed.");
      inTransaction.close();
      inOldMaster.close();
      System.exit(1);
    } // end catch
    catch (IllegalStateException stateException)
    {
      System.err.println("Error reading from file.");
      System.exit(1);
    } // end catch    
  } // end method updateRecords


  // close file and terminate application
  public void closeTransFile()
  {
    if (inTransaction != null)
      inTransaction.close();
  } // end method closeTransFile


  // close file and terminate application
  public void closeOldMastFile()
  {
    if (inOldMaster != null)
      inOldMaster.close();
  } // end method closeOldMastFile
  

  // close file
  public void closeNewMastFile()
  {
    if (outNewMaster != null)
      outNewMaster.close();
  } // end method closeNewMastFile


  // close file
  public void closeLogFile()
  {
    if (theLog != null)
      theLog.close();
  } // end method closeLogFile
  
} // end class FileMatch
-------------------------------------------------------------------------------------------------
// Exercise 14.8: FileMatchTest.java
// Testing class FileMatch

public class FileMatchTest
{
   // main method begins program execution
   public static void main( String args[] )
   { 
     FileMatch application = new FileMatch();

     application.openTransFile();
     application.openOldMastFile(); 
     application.openNewMastFile();
     application.openLogFile();
     application.updateRecords();
     application.closeLogFile();
     application.closeNewMastFile();
     application.closeOldMastFile();
     application.closeTransFile();

   } // end main

} // end class FileMatchTest
-------------------------------------------------------------------------------------------------
Sample data for master file:
Master file                          
Account Number            Name                     Balance
---------------------------------------------------------------------
100                            Alan Jones                   348.17
300                            Mary Smith                    27.19
500                            Sam Sharp                   0.00
700                            Suzy Green                   -14.22
Sample data for transaction file:
Transaction file                    Transaction
Account Number                  Amount
--------------------------------------------------------
100                                         27.14
300                                         62.11
300                                         83.89
400                                         100.56
700                                         80.78
700                                         1.53
900                                         82.17  
-------------------------------------------------------------------------------------------------

My FileMatch class program above has bugs in it.

The correct results for the newmast.txt:
100  Alan  Jones  375.31
300  Mary  Smith  173.19
500  Sam  Sharp  0.00
700  Suzy Green  68.09
The correct results for the log.txt:
Unmatched transaction record for account number 400Unmatched transaction record for account number 900
------------------------------------------------------------------------------------------------

My results for the newmast.txt:
100 Alan Jones 375.31
300 Mary Smith 111.08
500 Sam Sharp 0.00
700 Suzy Green -12.69
My results for the log.txt
Unmatched transaction record for account number 700
-------------------------------------------------------------------------------------------------

I am not sure what is wrong with my code above to make my results different from the correct results.
Much help is appreciated. Please help.
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Oct 9 2006
Added on Sep 7 2006
4 comments
498 views