从文本文件导入数据到数据库的问题

fingertiploneliness 2005-06-30 10:48:41
想做一个定时任务,在每天的某个时间将文本文件中的数据导入的某一个表中。
我的问题是如果这个文件是每天追加记录的(每天有新的数据加入到文件尾部)
如何判断每次该从哪里读取,如何跳过已经读过的行?

或者类似的问题该如何处理比较好,欢迎讨论
...全文
296 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
感谢大家的回复
to zhutouzip(醒了的鸟) :并不想针对具体的数据库,比如用Sql Server的BCP或者其他数据库的类似过程,而是想用class实现,比如用运行一个TimerTask。
-------
如果此application的数据来自其他的系统,可能每天一个新的ascii文件(日期相关的文件名)。也可能是同一个文件,总是把数据添加到最后,这个文件是copy或者upload过来的,每次覆盖原来的文件,提供的文件不保证每次添加都设置标志的(如果每次更新都添加标志位/行 当然好)
bluejingling 2005-06-30
  • 打赏
  • 举报
回复
请给我>100分的分数
bluejingling 2005-06-30
  • 打赏
  • 举报
回复
每天的日期时间是不一样的。
那么你放一个日期时间标志,下次读取时先找到这个标志。
比如 #20050629#
要注意的是,要统一日期格式为yyyymmdd或其它格式,以免出现格式不对而定位错误。
oswicer 2005-06-30
  • 打赏
  • 举报
回复
建议你把每天的数据各自放在一个txt里,就不存在

"如何判断每次该从哪里读取,如何跳过已经读过的行?"

的问题了

飞行的兔子 2005-06-30
  • 打赏
  • 举报
回复
最好指定一个具体的数据库,让大家讨论!
期待好的结果!
TonyZeus 2005-06-30
  • 打赏
  • 举报
回复
是否可以将表清空一下,重新全部导入呢?这只是瞬间的一种想法,可能不是太好
oyljerry 2005-06-30
  • 打赏
  • 举报
回复
读取文件到末尾,然后append
说好不能打脸 2005-06-30
  • 打赏
  • 举报
回复
long = skip(long) 这是InputStream的跳转方法,注意参数是需要跳过的长度,返回值是实际跳过的长度
seek(long) 这是RandomAccessFile的跳转方法,直接指定要跳过长度就可以了
说好不能打脸 2005-06-30
  • 打赏
  • 举报
回复
先就楼主提出的问题进行解决:
解决方案一:
使用RandomAccessFile类和OutputStream接口(不要告诉我你不会用,如果真不会就该再补一补),他们都提供流与字节的指针定位方法skip(),用这种方法就可以很容易的找到要读取信息的指定位置,从而跳过以读信息。

解决方案二:
在文件中的已读部分的末尾增加一个标记如下:
*********************
******************************<readed>
而新写入的部分放在标记之后如下:
*********************
******************************<readed>&&&&&&&&&&&&&&&&&&&&&&&&
当又一次读取文件后,改变标记位置。

就我个人而言我会使用第一种方式,我这里有示例代码,但在另外一台机器上,如果需要我可以贴出方法一的示例代码。但两种方式都比较容易实现看楼主你怎么选。



我还想提一提我的个人意见,我觉得完全没有必要把文件内容写入数据库,只需要记录文件地址就可以了:步骤大致如下:
1、在确定的时间运行日志生成器,生成相应的日志文件,为了保证文名不会重名我们使用时间的long表示来作为文件名,如:200343853746.TXT

2、将文件地址记录与数据库,而非文件内容。

3、如果楼主真的想组合这些文件,那也没关系,用InputStream组合这些文件就可以了。
yanloveyan2004 2005-06-30
  • 打赏
  • 举报
回复
根据日期生成一个文本,存放当天的,比如20050630.txt存放今天的数据,20050701.txt存放明天的数据!
eureka0891 2005-06-30
  • 打赏
  • 举报
回复
我觉得每天把文件名设置成按日期的就行了,
没有一定的规则是不好的,
不遵从这个规则当然不导入这个文件,这是没办法的事情
laughsmile 2005-06-30
  • 打赏
  • 举报
回复
1.你可以在定时导入的Timer中加一个TimerTask,这个TimerTask每天晚上12点的时候读取文件。使用
RandomAccessFile myFile = new RandomAccessFile(String YourFilePath, String mode);读取文件,得到文件的长度myFile.length()。保存此值到一个static变量yesterdayMyFileLen中.
2.执行定时导入的时候,从yesterdayMyFileLen中读出昨天文件长度,
RandomAccessFile myFile = new RandomAccessFile(String YourFilePath, String mode);
定位文件
myFile.seek(yesterdayMyFileLen);
从此位置读到末尾
.....
long filePointer = 0;
long length = myFile.length();
String strLine ="";
while (filePointer < length) {
strLine = myFile.readLine();
System.out.println(strLine);
filePointer = myFile.getFilePointer();
}
rower203 2005-06-30
  • 打赏
  • 举报
回复
text可建ODBC源,
在结构上加入写入日期字段
导入时加入条件Where DateField = Today即可
ll42002 2005-06-30
  • 打赏
  • 举报
回复
先判断有没有时间标识,有,通过时间标识判断;
没有,将数据库表导出文件(可以是特定格式的),将两个文件作内容对比(现在比较高效的算法我知道的有B-tree),相同的记录删除,不同记录保留;
解析第二步中得到的文件,用批处理添加到数据库。
xiangxyz 2005-06-30
  • 打赏
  • 举报
回复
做一个标记,每次读完之后在最后写一个标记。
读的时候,找到标记,删除之,并从下一行开始写进数据库。
grapepaul 2005-06-30
  • 打赏
  • 举报
回复
用java实现性能不好
bxh2dai 2005-06-30
  • 打赏
  • 举报
回复
我觉得 bluejingling(总是想起蓝精灵) 说的楼主应该考虑:
有三点:
1、把每天的数据都按照时间来存放,变于查看。
2、省去了处理“如何判断每次该从哪里读取,如何跳过已经读过的行”的烦恼。
3、如果把数据都放在同一个文件里,文件会变得很庞大,不便于查看,而且文件不小心丢失,那可是全部数据,呵呵~!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧