2011-05-29 36 views
1

我有一個正在寫入每隔幾分鐘的日誌文件。我將有一個進程在特定的目錄上進行偵聽。每小時它將從這個csv文件導入新的行到一個訪問數據庫。不幸的是,csv文件沒有每行的唯一鍵。每小時導入csv文件的內容

問題是我該如何跟蹤要導入的新行?

如何知道何時導入新行?

另一個複雜因素是,有另一個程序每天刪除一次這個csv文件,所以我不能確切地跟蹤我停止的位置。

回答

2

日誌文件自然應該有時間戳。您可以按上次加載的日誌日期時間戳進行跟蹤。

如果您沒有日期時間或任何其他順序屬性進行跟蹤,則可以在每次加載後跟蹤文件長度。因此,在下次閱讀之前,您將當前文件流讀取器的位置設置爲前一次檢查中捕獲的文件長度的值。

[編輯]

關於您添加關於「另一個複雜」,有就是每天一次刪除該CSV文件的另一個程序的註釋:

  • 首先你需要的以確保此程序在導入內容的工具之後運行,否則當文件已被刪除但文件尾部尚未導入時會出現此情況
  • 其次,我猜新創建的日誌文件會很多與之前的f相比更小ile,所以你可以很容易地知道日誌已經翻過來了。根據文件的刪除方式,您可能需要按照Eric的建議使用文件創建日期時間。
0

如果日誌文件沒有唯一的鍵值,那麼您使用行號作爲鍵時會非常困難。 (使用文件流閱讀器的位置,就像@Alex Aza所建議的那樣,效率會更高,但聽起來你有點卡住,所以從行號開始可能會讓你去,然後你可以改進它。)

你說你不能使用職位,因爲該文件將在一夜之間被刪除,但你可以將其作爲特殊情況處理。如果可用的總行數(或最後一個文件位置)小於您讀取的前一個最遠位置,那麼您需要回到零。您還應該能夠使用該文件的創建時間來檢測自上次查看以來它是否已被替換。

0

通過它的聲音,你應該退一步 - 你實際上在記錄什麼?

必須有東西是唯一的,否則記錄插入兩次也沒關係。

回答您的問題:

  1. 您需要一種方法來映射每個唯一行。你說過它是一個日誌文件,所以我假設你沒有編輯(或更新)已經插入的記錄。
  2. 你怎麼知道何時導入新行?顯然你沒有。您將需要每次運行此過程並查看該行是否未添加。
  3. 這個數據有多重要?如果它是諸如信用卡交易之類的東西,那麼您將不會刪除它!如果它是從電話系統中說出一個日誌文件,那麼爲什麼不存檔數據?