2017-05-30 64 views
1

我有一个文本文件的下一行数据库:插入或更新基于文件

enter image description here

其中包含的信息与书的顺序在一个单一的订单可以包含多个副本一本或多本书。

我想计算客户在单个订单中花费的总金额,因此numCopies * bookPrice为订单中的每个ISBN。第一个命令是(1 * 15.99)= 15.99。第二个(10 * 11.99 + 20 * 14.99)= 419.70。第三个(1 * 15.99)。

我正在浏览带有扫描器的文本文件,随着文本文件的添加,将文本文件的元素添加到文本文件中。为了计算订单总额,我试图累积每本书在一行上出现的成本,直到达到orderNum发生变化的一行为止。然后将该总订单数量插入数据库。

不确定我可以正确检查何时应该释放订单总额并重置为下一个订单号并将此总计插入到数据库中。或者基本上按照我的计算总计,然后在读完所有订单数据后更新数据库。

相关代码:

class TestConnect { 
    static final String DROP_TABLE_BOOKORDER = "drop table if exists bookorder;"; 

    static final String CREATE_TABLE_BOOKORDER = 
      "create table bookorder (" + 
        " ordernumber VARCHAR(13) NOT NULL," + 
        " customername VARCHAR(100)," + 
        " orderdate DATE NOT NULL," + 
        " discount NUMERIC(8,2) NOT NULL," + 
        " totalamount INT NOT NULL," + 
        " PRIMARY KEY (ordernumber));"; 

    static final String INSERT_BOOKORDER_DATA = "insert into bookOrder (orderNumber, customerName, orderDate, discount, totalAmount) values (?, ?, ?, ?, ?);"; 

    createTables(); 
    loadTables(); 

    static void createTables() throws SQLException { 
     Statement stmt = conn.createStatement(); 
     stmt.execute(DROP_TABLE_BOOKORDER); 
     stmt.execute(CREATE_TABLE_BOOKORDER); 

    } 

    static void loadTables() throws SQLException, FileNotFoundException, ParseException { 
    Scanner lineScanner = new Scanner(new File(orderData)); 
     String headerLine = lineScanner.nextLine(); 

     float totalOrderAmount = 0.0f; 
     String previousKnownOrderNum = null; 

     while (lineScanner.hasNextLine()) { 
       String[] retrievedOrderLine = lineScanner.nextLine().split("\t"); 


       // if order number exists 
       if (!Objects.equals(retrievedOrderLine[0], "")) { 
        previousKnownOrderNum = retrievedOrderLine[0]; 

        // order number 
        bookOrderStmt.setString(1, retrievedOrderLine[0]); 

        //customer name 
        bookOrderStmt.setString(2, retrievedOrderLine[1]); 


        //order date 
        //handle date format conversion 
        String orderDate = retrievedOrderLine[2]; 
        System.out.println("now processing book order date as " + retrievedOrderLine[2]); 
        SimpleDateFormat formattedDate = new SimpleDateFormat("yyyy-MM-dd"); 
        java.util.Date date = formattedDate.parse(orderDate); 
        java.sql.Date sqlFormattedDate = new java.sql.Date(date.getTime()); 
        bookOrderStmt.setDate(3, sqlFormattedDate); 

        // discount 
        bookOrderStmt.setFloat(4, Float.parseFloat(retrievedOrderLine[3])); 


      } 

        // if line contains a book isbn 
        if(!Objects.equals(retrievedOrderLine[4], "")) { 

         // if next line contains an orderNumber (the length of the line = 10), then insert accumulated orderTotal into database 
         if (lineScanner.nextLine().length() == 10) { 

          float thisLinesAmount = Float.parseFloat(retrievedOrderLine[5]) * Float.parseFloat(retrievedOrderLine[6]); 

          totalOrderAmount = totalOrderAmount + thisLinesAmount; 
          bookOrderStmt.setFloat(5, totalOrderAmount); 

          // reset total amount 
          totalOrderAmount = 0.0f; 

          // else continue to accumulate 
         } else { 

          // insert a temp value for totalAmount 

          totalOrderAmount = totalOrderAmount + Float.parseFloat(retrievedOrderLine[5]) * Float.parseFloat(retrievedOrderLine[6]); 
          bookOrderStmt.executeUpdate(); 
          bookOrderStmt.close(); 
         } 
        } 

     } 
    } 
} 

测试文件:

OrderNum CustName OrderDate Discount ISBN NumCopies BookPrice ShipmentID ShipmentDate ShipCopies 
N201700001 John Doe 2017-4-24 1 1234567891 1 15.99 S0000003 2017-4-25 1 
N201700002 Jane Doe 2017-3-1 41.97 1234567890 10 11.99 S0000001 2017-3-2 5 
          S0000002 2017-3-15 5 
       1234567891 20 14.99 S0000001 2017-3-2 15 
          S0000002 2017-3-15 5 
N201700003 John Jones 2017-5-1 0 1234567891 1 15.99 

database table

+0

负载的每一行文件放入临时表并从中填充主表。 –

回答

0

我认为它得到的更清楚,如果你做更多的面向对象的。

这个助手类思(省略回答短促getter/setter方法):

public class BookOrder { 
    public String ordernumber; 
    public String customerName; 
    public Date orderDate; 
    public double discount; 
    public float totalamount; 
    public BookOrder(String on, String cn, Date od, double disc) { 
     ordernumber = on; 
     customerName = cn; 
     orderDate = od; 
     discount = disc; 
     totalamount = 0; 
    } 
    public void addAmount(float amount) { 
     totalamount += amount * discount; 
    } 
} 

此在的地方,你可以写你的循环要容易得多:

static void loadTables() { 
    Scanner lineScanner = new Scanner(new File(orderData)); 
    // skip headers 
    String headerLine = lineScanner.nextLine(); 

    BookOrder currentOrder = null; 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

    while (lineScanner.hasNextLine()) { 
      String[] retrievedOrderLine = lineScanner.nextLine().split("\t"); 

      // if order number exists 
      if (!Objects.equals(retrievedOrderLine[0], "")) { 
       //Ordernumber changed, but not null 
       if(currentOrder != null || 
         !currentOrder.ordernumber.equals(retrievedOrderLine[0])) { 
        //Insert into DB 
        insertBookOrder(currentOrder); 
       } 
       //Ordernumber changed or null (first order) 
       if(currentOrder == null || 
         !currentOrder.ordernumber.equals(retrievedOrderLine[0])) { 
        //Start the next order as ordernumber changed 
        currentOrder =new BookOrder(
          retrievedOrderLine[0], //ordernumber 
          retrievedOrderLine[1], //customer 
          dateFormat.parse(retrievedOrderLine[2]), //date 
          Float.parseFloat(retrievedOrderLine[3]) //discount 
          ); 
       } 
      } 
      //Now add to total (discount is taken care of in method) 
      currentOrder.addAmount(Float.parseFloat(retrievedOrderLine[5]));        
     } 
     //Afterwards we need to insert last item if it exists 
     if(currentOrder != null) { 
      //Insert into DB 
      insertBookOrder(currentOrder); 
     } 
    } 
+0

谢谢,insertBookOrder指的是什么? – Silverfin

+0

插入一行数据的新方法 - 您已经用某种方式来处理代码 – Jan