每小时导入一次csv文件的内容

时间:2011-05-29 21:53:40

标签: logging csv

我有一个每隔几分钟写一个日志文件。我将有一个将侦听特定目录的进程。它每小时都会将此csv文件中的新行导入访问数据库。不幸的是,csv文件没有每行的唯一键。

问题是我应该如何跟踪要导入的新行?

如何知道何时导入新行?

另一个复杂因素是有另一个程序每天删除一次这个csv文件,所以我无法准确跟踪我中断的位置。

3 个答案:

答案 0 :(得分:2)

日志文件自然应该有时间戳。您可以按上次加载的日志日期时间戳进行跟踪。

如果您没有要跟踪的日期时间或任何其他顺序属性,则可以在每次加载后跟踪文件长度。因此,在您下次阅读之前,您将当前文件流阅读器位置设置为上一次检查时捕获的文件长度值。

<强> [编辑]

关于你添加的关于“另一个复杂性”的评论,还有另一个程序每天删除一次这个csv文件:

  • 首先,您需要确保此程序在导入内容的工具之后运行,否则您将遇到文件已被删除但文件尾部尚未导入的情况
  • 其次,我猜新创建的日志文件将比以前的文件小得多,因此您可以轻松地判断该日志已被翻转。根据文件的删除方式,您可能希望使用Eric建议的文件创建日期时间。

答案 1 :(得分:0)

如果日志文件没有唯一键,那么您几乎不会使用行号作为键。 (正如@Alex Aza建议的那样,使用文件流阅读器位置会更有效率,但听起来你有点卡住,所以从行号开始可能会让你去,然后你可以改进它。)

你说你不能使用某个职位,因为该文件将在一夜之间被删除,但你可以将其作为一个特例来处理。如果可用的总行数(或最后一个文件位置)小于您读取的上一个最远位置,则需要返回零。您还应该能够使用文件的创建时间来检测自上次查看以来它是否已被替换。

答案 2 :(得分:0)

听到它的声音,你应该退后一步 - 你实际记录的是什么?

必须有某事唯一,否则如果记录被插入两次则无关紧要。

回答你的问题:

  1. 您需要一种方法来映射每个唯一的行。你说它是一个日志文件,所以我假设你没有编辑(或更新)已插入的记录。
  2. 您如何知道何时导入新行?显然你没有。您需要每次都运行此过程,并查看是否尚未添加该行。
  3. 这些数据有多重要?如果它是信用卡交易之类的东西,你就不会删除它!如果是从电话系统说出日志文件那么为什么不归档数据呢?