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」)而不是帶有文件的單個目錄。
而且我知道代碼有點臃腫,但這是無能的編碼器(我)的結果。
我會建議打破它的調試。有很多檢查正在進行。首先確保你正在從maindir.listFiles()接收預期數量的文件;它顯示的尺寸是什麼?此外,還有更新/更好的選項可供選擇目錄樹。 – KevinO
'listFiles'確實*不*包含子文件夾中的文件。 –