【问题标题】:Inserting or updating a database based on the the next line of a file根据文件的下一行插入或更新数据库
【发布时间】:2017-05-31 00:34:41
【问题描述】:

我有一个文本文件:

其中包含与书籍订单有关的信息,其中一个订单可以包含一本书或多本书的多个副本。

我想计算客户在单个订单中花费的总金额,即订单中每个 ISBN 的 numCopies * bookPrice。第一个订单是 (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

【问题讨论】:

  • 将文件的每一行加载到临时表中,并从中填充主表。

标签: java mysql sql jdbc java.util.scanner


【解决方案1】:

我认为如果你更面向对象一点,它会变得更加清晰。

想想这个帮助类(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);
        }
    }

【讨论】:

  • 插入一行数据的新方法——你已经以某种方式使用了该代码
猜你喜欢
  • 1970-01-01
  • 2015-12-18
  • 2023-02-10
  • 2018-01-20
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多