2012-01-04 84 views
1

我目前有一個日誌文件(見下文),我需要迭代並提取已掃描文件的列表。然後通過使用該文件列表將掃描的文件複製到不同的目錄中。在Java中遍歷一個日誌文件。拉文件掃描

所以在這種情況下,它會經過拉 C:\工具\ baregrep.exe C:\工具\ baretail.exe 等等等等

,然後將它們移動到文件夾,例如c :\文件夾\ SafeFolder具有相同的文件結構

我希望我能有什麼樣的輸出是一個失敗的掃描樣本,但是這將讓我一個很好的開端,我大概可以算出其餘出

Symantec Image of Log File

非常感謝您的幫助,我非常感謝您借給我的幫助。

回答

0

這應該可以做到。現在,適應您的解決方案!

public static void find(String logPath, String safeFolder) throws FileNotFoundException, IOException { 
    ArrayList<File> files = new ArrayList<File>(); 

    BufferedReader br = new BufferedReader(new FileReader(logPath)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = br.readLine()) != null) { 
     Pattern pattern = Pattern.compile("'[a-zA-Z]:\\\\.+?'"); 
     Matcher matcher = pattern.matcher(line); 
     if (matcher.matches()) { 
     } 
     if (matcher.find()) { 
      files.add(new File(matcher.group())); 
      System.out.println("Got a new file! " + files.get(files.size() - 1)); 
     } 
    } 

    for (File f : files) { 
     // Make sure we get a file indeed 
     if (f.exists()) { 
      if (!f.renameTo(new File(safeFolder, f.getName()))) { 
       System.err.println("Unable to move file! " + f); 
      } 
     } else { 
      System.out.println("I got a wrong file! " + f); 
     } 
    } 
} 
+0

這看起來像會起作用。但是,我會在哪裏放置從「處理文件」之後和下一個「之前」拉出的位置。「只是得到文件路徑輸出 – Heuristic 2012-01-05 16:30:00

+0

任何人有任何輸入? 再次感謝您的幫助。 – Heuristic 2012-01-06 16:28:31

+0

我不明白你的問題,你可以再試一次並解釋一下嗎? – SHiRKiT 2012-01-07 17:32:48

0

它很簡單。

  1. 使用NEW_LINE作爲分隔符逐行讀取日誌文件。如果這是一個小文件,隨時通過String.split加載它&處理它(「\ n」)或StringTokenizer的

  2. 當你循環每一行,你需要做一個簡單的測試,如果該字符串檢測包含「處理文件」。

  3. 如果是這樣,使用正則表達式(更難)或簡單的解析來捕獲文件名。它應該在[']之內,因此檢測[']的第一次出現,然後檢測第二次,並獲取中間的字符串。

  4. 如果您的字符串是有效的(您可以使用java.io.File進行測試)或現有的,則可以將文件名複製到另一個文件。我不會建議你不要在java中複製它以滿足初學者的內存限制。

  5. 相反,複製文件的字符串,形成一個批處理文件來同時使用OS腳本如Windows BAT或bash腳本,例如CP'filename_from「copy_to_dir」

讓我將它們複製知道你需要

問候

+0

一個可行的例子如果不是太痛苦的話會很好。 – Heuristic 2012-01-04 22:07:47

1

工作示例這個問題被標記爲Java和像我愛的Java,這個問題是什麼,會更容易和更快地解決語言如Perl(所以如果你只想要最終結果和d o不需要在特定的環境中運行,那麼您可能希望使用腳本語言)。

不是一個可行的實現,但是下面的代碼是perl需要的所有代碼:(語法未經測試,可能按照原樣被破壞,只是作爲指南..自從我編寫任何perl以來已經有一段時間了)。

use File::Copy; 
my $outdir = "c:/out/"; 
while(<>) 
{ 
    my ($path) = /Processing File\s+\'([^\']+)\'/; 
    my ($file) = $path =~ /(.*\\)+([^\\]+)/; 
    if (($file) && (-e $path)) 
    { 
    copy($path,$outdir . $file); 
    } 
} 
+0

請注意他在第5行和第6行發生了什麼。您可以使用RegEx直接在Java中執行此操作。他一行一行地閱讀,並使用正則表達式分組來提取他傳遞的複製的特定文件名。不想在Java中這樣做,你可能會害怕Perl(我這樣做)......給groovy一個鏡頭。 – 2012-01-04 23:06:18