想做一个定时任务,在每天的某个时间将文本文件中的数据导入的某一个表中。
我的问题是如果这个文件是每天追加记录的(每天有新的数据加入到文件尾部)
如何判断每次该从哪里读取,如何跳过已经读过的行? 或者类似的问题该如何处理比较好,欢迎讨论

解决方案 »

  1.   

    建议你把每天的数据各自放在一个txt里,就不存在  "如何判断每次该从哪里读取,如何跳过已经读过的行?"的问题了
      

  2.   

    每天的日期时间是不一样的。
    那么你放一个日期时间标志,下次读取时先找到这个标志。
    比如 #20050629#
    要注意的是,要统一日期格式为yyyymmdd或其它格式,以免出现格式不对而定位错误。
      

  3.   

    感谢大家的回复
    to zhutouzip(醒了的鸟) :并不想针对具体的数据库,比如用Sql Server的BCP或者其他数据库的类似过程,而是想用class实现,比如用运行一个TimerTask。
    -------
    如果此application的数据来自其他的系统,可能每天一个新的ascii文件(日期相关的文件名)。也可能是同一个文件,总是把数据添加到最后,这个文件是copy或者upload过来的,每次覆盖原来的文件,提供的文件不保证每次添加都设置标志的(如果每次更新都添加标志位/行 当然好)
      

  4.   

    我觉得 bluejingling(总是想起蓝精灵) 说的楼主应该考虑:
    有三点:
    1、把每天的数据都按照时间来存放,变于查看。
    2、省去了处理“如何判断每次该从哪里读取,如何跳过已经读过的行”的烦恼。
    3、如果把数据都放在同一个文件里,文件会变得很庞大,不便于查看,而且文件不小心丢失,那可是全部数据,呵呵~!
      

  5.   

    先判断有没有时间标识,有,通过时间标识判断;
    没有,将数据库表导出文件(可以是特定格式的),将两个文件作内容对比(现在比较高效的算法我知道的有B-tree),相同的记录删除,不同记录保留;
    解析第二步中得到的文件,用批处理添加到数据库。
      

  6.   

    text可建ODBC源,
    在结构上加入写入日期字段
    导入时加入条件Where DateField = Today即可
      

  7.   

    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();
    }
      

  8.   

    根据日期生成一个文本,存放当天的,比如20050630.txt存放今天的数据,20050701.txt存放明天的数据!
      

  9.   

    先就楼主提出的问题进行解决:
    解决方案一:
    使用RandomAccessFile类和OutputStream接口(不要告诉我你不会用,如果真不会就该再补一补),他们都提供流与字节的指针定位方法skip(),用这种方法就可以很容易的找到要读取信息的指定位置,从而跳过以读信息。解决方案二:
    在文件中的已读部分的末尾增加一个标记如下:
    *********************
    ******************************<readed>
    而新写入的部分放在标记之后如下:
    *********************
    ******************************<readed>&&&&&&&&&&&&&&&&&&&&&&&&
    当又一次读取文件后,改变标记位置。就我个人而言我会使用第一种方式,我这里有示例代码,但在另外一台机器上,如果需要我可以贴出方法一的示例代码。但两种方式都比较容易实现看楼主你怎么选。我还想提一提我的个人意见,我觉得完全没有必要把文件内容写入数据库,只需要记录文件地址就可以了:步骤大致如下:
    1、在确定的时间运行日志生成器,生成相应的日志文件,为了保证文名不会重名我们使用时间的long表示来作为文件名,如:200343853746.TXT2、将文件地址记录与数据库,而非文件内容。3、如果楼主真的想组合这些文件,那也没关系,用InputStream组合这些文件就可以了。
      

  10.   

    long = skip(long) 这是InputStream的跳转方法,注意参数是需要跳过的长度,返回值是实际跳过的长度
    seek(long) 这是RandomAccessFile的跳转方法,直接指定要跳过长度就可以了