解析xls、csv文件所用到的pom
<!-- 工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
用到的類
package com.chuangqi.tool.readFile;
import java.util.List;
/**
* 讀取文件-策略接口
*/
public interface ReadStrategy {
/**
* 讀取文件指定行或全部內容
* @param filePathName 讀取文件路徑
* @param line 讀取多少行,如果line=0則表示讀取全部內容
* @return
*/
List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception;
}
package com.chuangqi.tool.readFile;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* @Description 讀取txt文件
* @Author qizhentao
* @Date 2020/3/12 13:58
* @Version 1.0
*/
public class ReadTxt implements ReadStrategy {
@Override
public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
int index = 0; // 索引
if(line == null){
line = 50; // 如果不傳入顯示多少行,則默認展示50行
}
// 讀取文件
FileInputStream fileInputStream = new FileInputStream(filePathName);
Scanner scanner = new Scanner(fileInputStream) ;
// 獲取文件第一行數據,設爲title
String nextLine = scanner.nextLine();
// title內容
String [] title = nextLine.split("\\s+");
// 列數
int lineNumber = title.length;
// 封裝最終數據
List<List<Object>> list = new ArrayList<>(lineNumber);
list.add(Arrays.asList(title));
// 用於存儲每行數據
List<Object> lineList = new ArrayList();
while(scanner.hasNext()){
// 展示指定行數據
if(line != 0 && index >= (lineNumber * line)){
/*
// 打印最終封裝的數據
for (List li:list) {
Console.log(li);
}*/
fileInputStream.close();
scanner.close();
return list;
}
lineList.add(scanner.next());
// 讀取完一行數據
if (++index % lineNumber == 0){
list.add(lineList);
lineList = new ArrayList();
//System.out.println(world);
continue;
}
//System.out.print(world + " ");
}
fileInputStream.close();
scanner.close();
return list;
}
}
package com.chuangqi.tool.readFile;
import java.util.List;
/**
* @Description 讀取dat文件
* @Author qizhentao
* @Date 2020/3/12 14:08
* @Version 1.0
*/
public class ReadDat implements ReadStrategy{
@Override
public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
ReadTxt readTxt = new ReadTxt();
return readTxt.readFileAppointLine(filePathName, line);
}
}
package com.chuangqi.tool.readFile;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import java.util.List;
/**
* @Description 讀取xls文件
* @Author qizhentao
* @Date 2020/3/12 14:10
* @Version 1.0
*/
public class ReadXls implements ReadStrategy{
@Override
public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
if(line == null){
line = 51;
}
// 讀取xls、csv文件
ExcelReader reader = ExcelUtil.getReader(filePathName);
// 獲取文件中所有內容
List<List<Object>> readAll = reader.read();
// 返回所有數據
if(line == 0){
return readAll;
}
// 封裝指定條數內容
List<List<Object>> subList = readAll.subList(0, (line + 1));
/*// 打印
for (List li : subList) {
Console.log(li);
}*/
return subList;
}
}
package com.chuangqi.tool.readFile;
import java.util.List;
/**
* @Description 讀取csv文件
* @Author qizhentao
* @Date 2020/3/12 14:12
* @Version 1.0
*/
public class ReadCsv implements ReadStrategy{
@Override
public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
ReadXls readXls = new ReadXls();
return readXls.readFileAppointLine(filePathName, line);
}
}
package com.chuangqi.tool.readFile;
import cn.hutool.core.lang.Console;
import java.util.List;
/**
* @Description 讀取文件-策略封裝
* @Author qizhentao
* @Date 2020/3/12 14:31
* @Version 1.0
*/
public class ReadStrategyContent {
private ReadStrategy readStrategy;
public ReadStrategyContent(){
}
public ReadStrategyContent(ReadStrategy readStrategy){
this.readStrategy = readStrategy;
}
/**
* 通過無參構造讀取txt、dat、csv、xls文件內容
*
* @param filePathName 文件全路徑
* @param line 讀取行數,0表示讀取全部內容
* @return
*/
public List<List<Object>> getReadFile(String filePathName, Integer line){
if (filePathName.endsWith(".txt") || filePathName.endsWith(".TXT")){
readStrategy = new ReadTxt();
}else if(filePathName.endsWith(".dat") || filePathName.endsWith(".DAT")){
readStrategy = new ReadDat();
}else if(filePathName.endsWith(".csv") || filePathName.endsWith(".CSV")){
readStrategy = new ReadCsv();
}else if(filePathName.endsWith(".xls") || filePathName.endsWith(".xlsx") || filePathName.endsWith(".XLS") || filePathName.endsWith(".XLSX")){
readStrategy = new ReadXls();
}
return getStructureReadFile(filePathName, line);
}
/**
* 通過有構造執行對應的方法
*
* @param filePathName 讀取文件全路徑
* @param line 讀取行數,0表示讀取全部內容
* @return
*/
public List<List<Object>> getStructureReadFile(String filePathName, Integer line){
if (readStrategy == null){
Console.log("ReadStrategy不能爲空");
}
try {
return readStrategy.readFileAppointLine(filePathName, line);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 測試
public static final String DAT = "C:\\Users\\cq\\Desktop\\Data1隨機數30.DAT";
public static final String TXT = "C:\\Users\\cq\\Desktop\\Data1_Step_PZ.txt";
public static final String CSV = "C:\\Users\\cq\\Desktop\\csv測試.csv";
public static final String XLS = "C:\\Users\\cq\\Desktop\\xls測試.xls";
public static void main(String[] args) {
// 無參構造讀取
long l = System.currentTimeMillis();
ReadStrategyContent readStrategyContent = new ReadStrategyContent();
List<List<Object>> readFile = readStrategyContent.getReadFile(TXT, 100000);
System.out.println(System.currentTimeMillis() - l);
// 文件行數 解析加載耗時(毫秒)
// 10000 130
// 100000 360
// 1000000 3500
/*
for (List li:readFile) {
Console.log(li);
}
Console.log("讀取行數:{}",readFile.size());
*/
/*// 有參構造讀取
ReadStrategyContent readStrategyContent = new ReadStrategyContent(new ReadTxt());
List<List<Object>> readFile = readStrategyContent.getReadFile("C:\\Users\\cq\\Desktop\\項目參考文檔\\BS仿真評估\\gitLab\\測試導入文件\\Data1_Step_PZ.txt", 50);
for (List li:readFile) {
Console.log(li);
}*/
}
}