java文件读写功能成批导入数据
很长时间没有贴代码了,虽然一直在写代码.这次,贴一下昨天的代码片断.
任务:图书馆新进了一批图书,数量是500多本,图书馆已经根据书商提高的书目,进行初步加工,补上了简单的编目,加入了出版年份之类,以符合图书馆系统书目记录的核心字段。要求用程序自动导入到图书馆系统。
原文是excel格式。
图书馆系统的后台数据库是oracle 10g。初步考虑有2种方案,第一种是将数据导入到文本文件,由oracle的数据导入功能实现导入。这种办法,前几年就使用过。第二种方法,提高java文件读写功能,读入各条记录,用java文件通过图书馆系统写入后台数据库。
由于第二种方法,以前还没有使用过,觉得有必要补充这一块的知识,因此采用了第二种方法。
首先,将excel文件中的数据另存到文本文件,以默认的制表符分隔字段。book2005.txt条目如下:
书架号 序号 书 名 作者 类别 索书号 ISBN 出版社 价格 出版年份
102 110 关贸总协定和世贸组织的法理(第二版) 杰克森(Jackson) 经济 F743-53/102 7-04-011672-3 高等教育 40.00 2002
102 139 沃顿创业第1书 约翰·拉斯克 经济 F270/102 7-04-015906-6 高等教育 25.00 2004.11
102 140 持?煜? 凯文·肯尼迪 经济 F276.6/102 7-04-015821-3 高等教育 32.00 2004.11
102 143 十倍速可持续成长 周仲庚 经济 F276.6/102 7-04-015953-8 高等教育 35.00 2004.1
.......
每条记录,共10个字段,其中前2个字段不需要。
其次,代码编写。考虑方法是通过java io将数据读入,每条记录读入到一个长度为10的String[],所有的记录合成String[][]。最后,提过原有的Spring+Hibernate代码导入到数据库。
为了快速,编码直接在Junit测试文件上进行。

package elib.dao;

import java.util.List;
import junit.framework.TestCase;
import java.math.BigDecimal;
import elib.service.*;
import elib.FileUtil;
import java.io.IOException;
import java.io.*;
import elib.DigitUtil;
import elib.ElibUtil;


// added by hofman on 2005-12-06
/* BaseDAOTest.java 是Junit TestCase文件的扩展文件,初始化了对Spring调度的各种beans的调用能力。
*/

public class FileTest extends BaseDAOTest {

public void testReadFile() throws IOException {
String filename =
"/upload/book2005.txt";
File file = new File(filename);
BufferedReader br = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String line = null;
int i= 0;
String[][] recs = new String[535][10];
String[] rec = null;
while ((line = br.readLine()) != null) {
// 每行是一条记录,一条记录的各个字段由tab分隔。
rec = line.split(
"\\t");
// 将单条记录导入记录集合
for(int j=0; j<10;j++) {
recs<i>[j] = rec[j];
}
i++;

if(i == 535) break;
}
br.close();
//数据读入验证
//if(recs.length < 535) return;
//assertEquals(535, i);
// assertEquals("文学", recs[2][4]);
//assertEquals("2003.4", recs[299][9]);

Book book;
BigDecimal bid = new BigDecimal(
"82000");
String cdate = ElibUtil.getDate();
int k;
for( k=0;k<241;k++) {
book = new Book();
bid = bid.add(oneVal);
book.setBookid(bid);
book.setBookname(recs[k][2]);
book.setAuthor(recs[k][3]);
book.setSubject(recs[k][4]);
book.setCheckout(recs[k][5]);
book.setIsbn(recs[k][6]);
book.setPublisher(recs[k][7]);
// price是BigDecimal类型,此处进行验证
String sprice = recs[k][8];
BigDecimal price = DigitUtil.stringToBigDecimal(sprice);
// 跳过不合格的记录
if(price == null) continue;

book.setPrice(price);
book.setCopyyear(recs[k][9]);
book.setCdate(cdate);
book.setMdate(cdate);
// 调用service相关代码,导入数据
bMgr.addBook(book);
}
assertEquals(535, k);

}

protected void setUp() throws Exception {
super.setUp();
}

protected void tearDown() throws Exception {
super.tearDown();
}

public static void main(String[] args) {
junit.swingui.TestRunner.run(FileTest.class);
}
}

hofman   2005-12-06 16:06:49 评论:0   阅读:5261   引用:0

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

2003-2007@copyright