【发布时间】: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