2017-05-31 100 views
0

我正在使用enron電子郵件數據集進行一些數據挖掘。 我試圖遍歷目錄中的每個文件,並將每個文件的日期,時間和地址解析爲csv文件。Java不會遍歷大目錄中的所有文件

問題是,java似乎並沒有遍歷所有這些,這就是爲什麼我的csv文件大約1000行太短。我該如何解決這個問題?

我的代碼:

public class FileReader { 


    public static void main(String[] args) throws FileNotFoundException{ 
    FileReader fileReader = new FileReader(); 

    //fileReader.mainFunction("maildir/skilling-j/_sent_mail"); 
    fileReader.mainFunction("maildir/skilling-j/inbox"); 
    /*fileReader.mainFunction("maildir/skilling-j/sent"); 
    fileReader.mainFunction("maildir/lay-k/inbox"); 
    fileReader.mainFunction("maildir/lay-k/_sent"); 
    fileReader.mainFunction("maildir/lay-k/sent");*/ 
    System.out.println("done!"); 

    } 
    public void mainFunction(String fileName) throws FileNotFoundException{ 
    File maindir = new File(fileName); 
    PrintWriter pw = new PrintWriter(new File("Analysis.csv")); 
    StringBuilder sb = new StringBuilder(); 
    StringBuilder sbpre = new StringBuilder(); 

    Scanner scanner; 
    sbpre.append("Date"); 
    sbpre.append(','); 
    sbpre.append("Time"); 
    sbpre.append(","); 
    sbpre.append("From"); 
    sbpre.append('\n'); 
    int endcounter = 0; 
    pw.write(sbpre.toString()); 
    File [] files = maindir.listFiles(); 
     for(int i = 0; i < files.length; i++){ 
      scanner = new Scanner(files[i]); 
      System.out.println(files[i].getPath()); 
      while (scanner.hasNextLine()) { 
       String lineFromFile = scanner.nextLine(); 
       String month = "Jun"; 
       String year = "2000"; 
       String time = "00:00:00"; 
       if(lineFromFile.contains("Date:") & (lineFromFile.length()== 43 | lineFromFile.length()== 42)){ 
        if(lineFromFile.length()==43){ 
         sb.append(lineFromFile.substring(11,13)); 
         month = lineFromFile.substring(14, 17); 
         year = lineFromFile.substring(18,22); 
         time = lineFromFile.substring(23,30); 
        }else{ 
         sb.append("0"); 
         sb.append(lineFromFile.substring(11,12)); 
         month = lineFromFile.substring(13, 16); 
         year = lineFromFile.substring(17,21); 
         time = lineFromFile.substring(22,29); 
              }     
        sb.append("."); 

        switch(month){ 
        case "Jan":sb.append("01"); sb.append(".");break; 
        case "Feb":sb.append("02"); sb.append(".");break; 
        case "Mar":sb.append("03"); sb.append(".");break; 
        case "Apr":sb.append("04"); sb.append(".");break; 
        case "May":sb.append("05"); sb.append(".");break; 
        case "Jun":sb.append("06"); sb.append(".");break; 
        case "Jul":sb.append("07"); sb.append(".");break; 
        case "Aug":sb.append("08"); sb.append(".");break; 
        case "Sep":sb.append("09"); sb.append(".");break; 
        case "Oct":sb.append("10"); sb.append(".");break; 
        case "Nov":sb.append("11"); sb.append(".");break; 
        case "Dec":sb.append("12"); sb.append(".");break; 
        } 
        sb.append(year); 
        sb.append(","); 
        sb.append(time); 
        sb.append(","); 


      } 

       if(lineFromFile.contains("X-From:")) { 
         lineFromFile = lineFromFile.replace(",", " "); 
         sb.append(lineFromFile.substring(8)); 

        } 

      pw.write(sb.toString()); 
      sb.setLength(0); 
     } 
      sb.append('\n'); 
      endcounter = i; 
    } 
     pw.close(); 
     System.out.println(endcounter); 
    } 
} 

控制檯日誌的最後幾行:

maildir\skilling-j\inbox\997_ 
maildir\skilling-j\inbox\998_ 
maildir\skilling-j\inbox\999_ 
maildir\skilling-j\inbox\99_ 
maildir\skilling-j\inbox\9_ 
1251 
done! 

它應該是真正圍繞2500線。

也很高興知道如何通過目錄遍歷目錄(例如「maildir/skilling-j」)而不是帶有文件的單個目錄。

而且我知道代碼有點臃腫,但這是無能的編碼器(我)的結果。

+0

我會建議打破它的調試。有很多檢查正在進行。首先確保你正在從maindir.listFiles()接收預期數量的文件;它顯示的尺寸是什麼?此外,還有更新/更好的選項可供選擇目錄樹。 – KevinO

+0

'listFiles'確實*不*包含子文件夾中的文件。 –

回答

0

listFiles()方法返回文件和目錄的列表。您可以使用isFile(),isDirectory()方法來識別文件的類型。試試這個簡單的代碼文件夾中,以驗證文件:

File[] files = maindir.listFiles(); 
    System.out.println("Files count: " + files.length); 
    for (int i = 0; i < files.length; i++) { 
     System.out.print(files[i].getAbsolutePath()); 
     if (files[i].isDirectory()) { 
      System.out.println(" dir"); 
     } else if (files[i].isFile()) { 
      System.out.println(" file"); 
     } 
    } 

你可以使用的isdirectory()方法僅過濾目錄和迭代扔。

相關問題