从文本文件导入数据到数据库的问题 想做一个定时任务,在每天的某个时间将文本文件中的数据导入的某一个表中。我的问题是如果这个文件是每天追加记录的(每天有新的数据加入到文件尾部)如何判断每次该从哪里读取,如何跳过已经读过的行? 或者类似的问题该如何处理比较好,欢迎讨论 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 建议你把每天的数据各自放在一个txt里,就不存在 "如何判断每次该从哪里读取,如何跳过已经读过的行?"的问题了 每天的日期时间是不一样的。那么你放一个日期时间标志,下次读取时先找到这个标志。比如 #20050629#要注意的是,要统一日期格式为yyyymmdd或其它格式,以免出现格式不对而定位错误。 感谢大家的回复to zhutouzip(醒了的鸟) :并不想针对具体的数据库,比如用Sql Server的BCP或者其他数据库的类似过程,而是想用class实现,比如用运行一个TimerTask。-------如果此application的数据来自其他的系统,可能每天一个新的ascii文件(日期相关的文件名)。也可能是同一个文件,总是把数据添加到最后,这个文件是copy或者upload过来的,每次覆盖原来的文件,提供的文件不保证每次添加都设置标志的(如果每次更新都添加标志位/行 当然好) 我觉得 bluejingling(总是想起蓝精灵) 说的楼主应该考虑:有三点:1、把每天的数据都按照时间来存放,变于查看。2、省去了处理“如何判断每次该从哪里读取,如何跳过已经读过的行”的烦恼。3、如果把数据都放在同一个文件里,文件会变得很庞大,不便于查看,而且文件不小心丢失,那可是全部数据,呵呵~! 先判断有没有时间标识,有,通过时间标识判断;没有,将数据库表导出文件(可以是特定格式的),将两个文件作内容对比(现在比较高效的算法我知道的有B-tree),相同的记录删除,不同记录保留;解析第二步中得到的文件,用批处理添加到数据库。 text可建ODBC源,在结构上加入写入日期字段导入时加入条件Where DateField = Today即可 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();} 根据日期生成一个文本,存放当天的,比如20050630.txt存放今天的数据,20050701.txt存放明天的数据! 先就楼主提出的问题进行解决:解决方案一:使用RandomAccessFile类和OutputStream接口(不要告诉我你不会用,如果真不会就该再补一补),他们都提供流与字节的指针定位方法skip(),用这种方法就可以很容易的找到要读取信息的指定位置,从而跳过以读信息。解决方案二:在文件中的已读部分的末尾增加一个标记如下:***************************************************<readed>而新写入的部分放在标记之后如下:***************************************************<readed>&&&&&&&&&&&&&&&&&&&&&&&&当又一次读取文件后,改变标记位置。就我个人而言我会使用第一种方式,我这里有示例代码,但在另外一台机器上,如果需要我可以贴出方法一的示例代码。但两种方式都比较容易实现看楼主你怎么选。我还想提一提我的个人意见,我觉得完全没有必要把文件内容写入数据库,只需要记录文件地址就可以了:步骤大致如下:1、在确定的时间运行日志生成器,生成相应的日志文件,为了保证文名不会重名我们使用时间的long表示来作为文件名,如:200343853746.TXT2、将文件地址记录与数据库,而非文件内容。3、如果楼主真的想组合这些文件,那也没关系,用InputStream组合这些文件就可以了。 long = skip(long) 这是InputStream的跳转方法,注意参数是需要跳过的长度,返回值是实际跳过的长度seek(long) 这是RandomAccessFile的跳转方法,直接指定要跳过长度就可以了 再遇xstream 问题。。。 关于frame的removeAll() Java 用awt包 中如何设置Button 大小? System.getProperty(); 关于类的创建问题 文件读取方面的问题 怎样获取一个网页中的文字内容? 如何根据字符串得到这个名字的类的instance? 初学java 谢谢各位大虾 我该买那本UML的书? 我在DatagramPacket的问题,我也说不清楚,大家帮我看看 初学者几道基础题目,谢谢
那么你放一个日期时间标志,下次读取时先找到这个标志。
比如 #20050629#
要注意的是,要统一日期格式为yyyymmdd或其它格式,以免出现格式不对而定位错误。
to zhutouzip(醒了的鸟) :并不想针对具体的数据库,比如用Sql Server的BCP或者其他数据库的类似过程,而是想用class实现,比如用运行一个TimerTask。
-------
如果此application的数据来自其他的系统,可能每天一个新的ascii文件(日期相关的文件名)。也可能是同一个文件,总是把数据添加到最后,这个文件是copy或者upload过来的,每次覆盖原来的文件,提供的文件不保证每次添加都设置标志的(如果每次更新都添加标志位/行 当然好)
有三点:
1、把每天的数据都按照时间来存放,变于查看。
2、省去了处理“如何判断每次该从哪里读取,如何跳过已经读过的行”的烦恼。
3、如果把数据都放在同一个文件里,文件会变得很庞大,不便于查看,而且文件不小心丢失,那可是全部数据,呵呵~!
没有,将数据库表导出文件(可以是特定格式的),将两个文件作内容对比(现在比较高效的算法我知道的有B-tree),相同的记录删除,不同记录保留;
解析第二步中得到的文件,用批处理添加到数据库。
在结构上加入写入日期字段
导入时加入条件Where DateField = Today即可
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();
}
解决方案一:
使用RandomAccessFile类和OutputStream接口(不要告诉我你不会用,如果真不会就该再补一补),他们都提供流与字节的指针定位方法skip(),用这种方法就可以很容易的找到要读取信息的指定位置,从而跳过以读信息。解决方案二:
在文件中的已读部分的末尾增加一个标记如下:
*********************
******************************<readed>
而新写入的部分放在标记之后如下:
*********************
******************************<readed>&&&&&&&&&&&&&&&&&&&&&&&&
当又一次读取文件后,改变标记位置。就我个人而言我会使用第一种方式,我这里有示例代码,但在另外一台机器上,如果需要我可以贴出方法一的示例代码。但两种方式都比较容易实现看楼主你怎么选。我还想提一提我的个人意见,我觉得完全没有必要把文件内容写入数据库,只需要记录文件地址就可以了:步骤大致如下:
1、在确定的时间运行日志生成器,生成相应的日志文件,为了保证文名不会重名我们使用时间的long表示来作为文件名,如:200343853746.TXT2、将文件地址记录与数据库,而非文件内容。3、如果楼主真的想组合这些文件,那也没关系,用InputStream组合这些文件就可以了。
seek(long) 这是RandomAccessFile的跳转方法,直接指定要跳过长度就可以了