
一班出勤.jpg

二班出勤.jpg

文件夾說明.jpg
java代碼
package com.work.tiangu.workanalysis.util;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FileUtilDemo {
public static void main(String[] arg0) {
List<File> list = getFileList("D:\\worktile\\export\\2018083122\\demo");//通過文件夾路徑,獲取文件列表,這里也可以優(yōu)化成由用戶輸入路徑的方式
List<String> allTxtList = new ArrayList<>();//定義一個集合用于存放所有txt文件的行內(nèi)容(存放未清洗的數(shù)據(jù))
List<String> listTemp = new ArrayList<>();//定義一個集合存放干凈的數(shù)據(jù)(存放清洗后的數(shù)據(jù))
List<String> listPerson = new ArrayList<>();//定義一個集合存放人的信息
if (list != null && !list.isEmpty()) {//如果文件列表不是空的
for (File file : list) {
allTxtList.addAll(txtContents(file));//將文件轉(zhuǎn)為集合放入總數(shù)據(jù)
}
System.out.println("在你選擇的文件路徑中,已讀取到 " + allTxtList.size() + " 條數(shù)據(jù)");
//去除缺失數(shù)據(jù)
for (String str : allTxtList) {//遍歷所有數(shù)據(jù)
if (str.length() > 5) {//如果數(shù)據(jù)未缺失
listTemp.add(str);//就把數(shù)據(jù)放入集合,這個集合里存在重復(fù)數(shù)據(jù),接下來統(tǒng)計這個集合里的人數(shù)出勤情況
}
if (str.length() > 5 && !listPerson.contains(str)) {//如果數(shù)據(jù)未缺失并且不重復(fù)
listPerson.add(str);
}
}
//統(tǒng)計個人出勤次數(shù)
for (String str : listPerson) {
System.out.println(str + "出勤次數(shù):" + Collections.frequency(listTemp, str));
}
System.out.println("據(jù)有效數(shù)據(jù)統(tǒng)計顯示,有 " + listPerson.size() + " 人有考勤記錄");
}
System.out.println("=============================================統(tǒng)計已完成");
}
/**
* 讀取文件夾中的所有文件
*
* @param path 文件夾路徑
*/
private static List<File> getFileList(String path) {
List<File> fileList = new ArrayList<>();//定義一個存放文件的集合
try {
File file = new File(path);//獲取路徑所指向的東西,判斷這個東西是個文件夾還是個文件
if (file.isDirectory()) {//如果它是個文件夾
File[] files = file.listFiles();//定義一個數(shù)組存放這個文件夾下面的所有文件(包括文件夾)
for (File fileIndex : files) {//遍歷這個數(shù)組,挨個獲取里面的文件,不確定這個文件是不是文件夾,如果是文件夾,還需要再讀取文件夾中的文件,這里可能會報NullPointerException
if (fileIndex.isDirectory()) {//如果是個文件夾
fileList.addAll(getFileList(fileIndex.getPath()));//遞歸獲取文件夾里的文件,放到集合里面,在遇到子文件夾為空時,也會報異常
} else {
fileList.add(fileIndex);
}
}
}
//如果不是個文件夾地址,則不做任何處理
} catch (NullPointerException e) {
System.out.println("空指針異常,信息提示為:" + e.getMessage());
} catch (Exception e) {
System.out.println("未知異常,信息提示為:" + e.getMessage());
}
return fileList;
}
/**
* 讀取一個txt文件,按行讀取,存入集合,這里返回的集合只是一個txt文件的行內(nèi)容
*/
private static List<String> txtContents(File file) {
ArrayList<String> txtList = new ArrayList<>();//定義一個集合存儲txt文件每行字符串
if (file.getName().endsWith(".txt")) {
try {
InputStreamReader inputReader = new InputStreamReader(new FileInputStream(file), "GB2312");//引入文件流讀取的工具類,編碼在控制臺輸出時用GB2312,其他地方換成UTF-8
BufferedReader bf = new BufferedReader(inputReader);//引入字符緩沖輸入流,加快讀取速度
// 按行讀取字符串
String str;//定義一個字符串變量
while ((str = bf.readLine()) != null) {//只要沒有讀到文件末尾,就一直讀取,讀到末尾會返回null
txtList.add(str.trim());//去除字符串兩端的空格,緩存在集合中
//System.out.println(str);
}
bf.close();//文件讀取完畢后,關(guān)閉緩沖流
inputReader.close();//關(guān)閉文件流
} catch (IOException e) {
e.printStackTrace();
}
return txtList;
} else {
System.out.println("跳過一個非txt文件:" + file.getName());
}
return txtList;
}
}