//生成CSV工具类
package cc.mrbird.febs.util;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
public class XmlToCSVUtils {
/**
* 生成为CVS文件
* @param exportData 源数据List
* @param fileds 对应的实体类列
* @param map csv文件的列表头map
* @param outPutPath 输出?文件路径
* @param csvFileName 文件名称
* @return
*/
@SuppressWarnings("rawtypes")
public static File createCSVFile(List exportData, String[] fileds, LinkedHashMap map, String outPutPath, String csvFileName) {
File csvFile = null;
BufferedWriter csvFileOutputStream = null;
try {
File file = new File(outPutPath);
if (!file.exists()) {
file.mkdir();
}
// 定义文件名格式并创建
csvFile = new File(outPutPath,csvFileName);
System.out.println("csv文件导出路径为:" + csvFile);
// UTF-8使正确读取分隔符","
csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(csvFile), "GBK"), 1024);
//System.out.println("csvFileOutputStream" + csvFileOutputStream);
//写入文件头部
for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
csvFileOutputStream.write((String) propertyEntry.getValue() != null ? new String(
((String) propertyEntry.getValue()).getBytes("GBK"), "GBK") : "");
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
//System.out.println(new String(((String) propertyEntry.getValue()).getBytes("GBK"), "GBK"));
}
csvFileOutputStream.write("\r\n");
// 写入文件内容
for (int j = 0; exportData != null && !exportData.isEmpty()
&& j < exportData.size(); j++) {
Header t = (Header) exportData.get(j);
Class clazz = t.getClass();
String[] contents = new String[fileds.length];
for (int i = 0; fileds != null && i < fileds.length; i++) {
String filedName = toUpperCaseFirstOne(fileds[i]);
Method method = clazz.getMethod(filedName);
method.setAccessible(true);
Object obj = method.invoke(t);
String str = String.valueOf(obj);
if (str == null || str.equals("null"))
str = "";
contents[i] = str;
}
for (int n = 0; n < contents.length; n++) {
// 将生成的单元格添加到工作表中
csvFileOutputStream.write(contents[n]);
csvFileOutputStream.write(",");
}
csvFileOutputStream.write("\r\n");
}
csvFileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
csvFileOutputStream.close(); //关闭文件流
} catch (IOException e) {
e.printStackTrace();
}
}
return csvFile;
}
/**
* .下载文件
* @param response
* @param csvFilePath 文件路径
* @param fileName 文件名称
* @throws IOException
*/
public static void exportFile(HttpServletResponse response,
String csvFilePath, String fileName) throws IOException {
response.setContentType("application/csv;charset=GBK");
response.setHeader("Content-Disposition", "attachment; filename="
+ new String(fileName.getBytes("GBK"), "ISO8859-1"));
// URLEncoder.encode(fileName, "GBK")
InputStream in = null;
try {
in = new FileInputStream(csvFilePath);
int len = 0;
byte[] buffer = new byte[1024];
response.setCharacterEncoding("GBK");
OutputStream out = response.getOutputStream();
while ((len = in.read(buffer)) > 0) {
// out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
out.write(buffer, 0, len);
}
} catch (FileNotFoundException e) {
System.out.println(e);
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
/**
* 删除该目录filePath下的所有文件
* @param filePath 文件目录路径
*/
public static void deleteFiles(String filePath) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
files[i].delete();
}
}
}
}
/**
* 删除单个文件
* @param filePath 文件目录路径
* @param fileName 文件名称
*/
public static void deleteFile(String filePath, String fileName) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
if (files[i].getName().equals(fileName)) {
files[i].delete();
return;
}
}
}
}
}
/**
* 将第一个字母转换为大写字母并和get拼合成方法
* @param origin
* @return
*/
private static String toUpperCaseFirstOne(String origin) {
StringBuffer sb = new StringBuffer(origin);
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
sb.insert(0, "get");
return sb.toString();
}
}
//读取xml工具类
package cc.mrbird.febs.util;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.*;
public class XmlToCsv {
/**
* loadXmlImportCSV
* 解析xml并导出csv
*/
public static void loadXmlImportCSV(String fileUrl){
String csvFileName=""; //csv文件名称
List<Header> headerList = new ArrayList<Header>();
SAXReader saxreader = new SAXReader();
File xmlFile = new File(fileUrl);
if(xmlFile.exists()) {
Document document;
try {
document = saxreader.read(xmlFile);
//System.out.println("smr标签下的内容:"+smrelem.getText());
//获取标签为object下的所有内容
List<Element> objectList = document.selectNodes("//bulkPmMrDataFile//gNB//measurement[1]//object");
int vNum = 1; //初始化行数
int cvsNum = 1; //初始化csv文件数量
for (int i = 0; i < objectList.size(); i++) {
Element object = objectList.get(i);
csvFileName="TEST"+"_"+document.getRootElement().element("gNB").attributeValue("id")+"_"+cvsNum+".csv";//以xml文件的eNBid命名
if(vNum>=(cvsNum+1)*1000000){
cvsNum++;
csvFileName="TEST"+"_"+document.getRootElement().element("gNB").attributeValue("id")+"_"+cvsNum+".csv";
exportCSV(headerList,csvFileName);
headerList=new ArrayList<>();
}
Iterator<Element> objectIterator = object.elementIterator();
while (objectIterator.hasNext()) {
vNum++;
Element v = objectIterator.next();
Header header = new Header(); //创建一个对象
//读取fileHeader标签
header.setEndTime(document.getRootElement().element("fileHeader").attributeValue("endTime"));
header.setFileFormatVersion(document.getRootElement().element("fileHeader").attributeValue("fileFormatVersion"));
header.setReportTime(document.getRootElement().element("fileHeader").attributeValue("reportTime"));
header.setStartTime(document.getRootElement().element("fileHeader").attributeValue("startTime"));
//读取object标签
header.setAMFPointer(v.getParent().attributeValue("AMFPointer"));
header.setAMFRegionID(v.getParent().attributeValue("AMFRegionID"));
header.setAMFSetID(v.getParent().attributeValue("AMFSetID"));
header.setAMFUENGAPID(v.getParent().attributeValue("AMFUENGAPID"));
header.setTimeStamp(v.getParent().attributeValue("TimeStamp"));
header.setId(v.getParent().attributeValue("id"));
//读取v标签
String vs = v.getText();
String[] arr = vs.split(" ");
header.setAa(arr[0].equals("NIL") ? "NIL" : arr[0]);
header.setBb(arr[1].equals("NIL") ? "NIL" : arr[1]);
header.setCc(arr[2].equals("NIL") ? "NIL" : arr[2]);
header.setDd(arr[3].equals("NIL") ? "NIL" : arr[3]);
header.setEe(arr[4].equals("NIL") ? "NIL" : arr[4]);
header.setFf(arr[5].equals("NIL") ? "NIL" : arr[5]);
header.setGg(arr[6].equals("NIL") ? "NIL" : arr[6]);
header.setHh(arr[7].equals("NIL") ? "NIL" : arr[7]);
header.setIi(arr[8].equals("NIL") ? "NIL" : arr[8]);
header.setJj(arr[9].equals("NIL") ? "NIL" : arr[9]);
header.setKk(arr[10].equals("NIL") ? "NIL" : arr[10]);
header.setLl(arr[11].equals("NIL") ? "NIL" : arr[11]);
header.setMm(arr[12].equals("NIL") ? "NIL" : arr[12]);
header.setNn(arr[13].equals("NIL") ? "NIL" : arr[13]);
header.setOo(arr[14].equals("NIL") ? "NIL" : arr[14]);
header.setPp(arr[15].equals("NIL") ? "NIL" : arr[15]);
header.setQq(arr[16].equals("NIL") ? "NIL" : arr[16]);
header.setRr(arr[17].equals("NIL") ? "NIL" : arr[17]);
header.setSs(arr[18].equals("NIL") ? "NIL" : arr[18]);
header.setTt(arr[19].equals("NIL") ? "NIL" : arr[19]);
header.setUu(arr[20].equals("NIL") ? "NIL" : arr[20]);
header.setVv(arr[21].equals("NIL") ? "NIL" : arr[21]);
header.setWw(arr[22].equals("NIL") ? "NIL" : arr[22]);
headerList.add(header);
}
}
if(vNum<1000000){//根据自己情况定义最大行数
exportCSV(headerList,csvFileName); //行数小于一百万行时导出到第一个csv文件下
}
} catch (Exception e) {
e.printStackTrace();
headerList.clear();
}
}
}
public static void exportCSV(List headerList, String csvFileName){ //导出csv文件
LinkedHashMap map = new LinkedHashMap(); //写入csv表头
map.put("1", "endTime");
map.put("2", "fileFormatVersion");
map.put("3", "reportTime");
map.put("4", "startTime");
map.put("5", "AMFPointer");
map.put("6", "AMFRegionID");
map.put("7", "AMFSetID");
map.put("8", "AMFUENGAPID");
map.put("9", "TimeStamp");
map.put("10", "id");
map.put("11", "MR.NRScSSRSRP");
map.put("12", "MR.NRNcSSRSRP");
map.put("13", "MR.NRScSSRSRQ");
map.put("14", "MR.NRNcSSRSRQ");
map.put("15", "MR.NRScSSSINR");
map.put("16", "MR.NRNcSSSINR");
map.put("17", "MR.NRScTadv");
map.put("18", "MR.NRScPHR");
map.put("19", "MR.NRScArfcn");
map.put("20", "MR.NRScPci");
map.put("21", "MR.NRNcArfcn");
map.put("22", "MR.NRNcPci");
map.put("23", "MR.LteNcRSRP");
map.put("24", "MR.LteNcRSRQ");
map.put("25", "MR.LteNcEarfcn");
map.put("26", "MR.LteNcPci");
map.put("27", "MR.hAOA");
map.put("28", "MR.vAOA");
map.put("29", "MR.NRUEPlrUL");
map.put("30", "MR.NRUEPlrDL");
map.put("31", "MR.PLMN");
map.put("32", "MR.NRScSSBIndexId");
map.put("33", "MR.NRNcSSBIndexId");
String path = fileUrl;
// String path = "D://SendFloder//exportcsv//"; //csv文件导出路径
String fileds[] = new String[]{"endTime", "fileFormatVersion", "reportTime", "startTime"
,"aMFPointer","aMFRegionID","aMFSetID","aMFUENGAPID","timeStamp","id"
, "aa", "bb","cc", "dd", "ee", "ff","gg","hh", "ii", "jj", "kk","ll","mm", "nn"
, "oo", "pp","qq","rr", "ss", "tt", "uu","vv","ww"};// 设置列英文名(也就是实体类里面对应的列名)
XmlToCSVUtils.createCSVFile(headerList, fileds, map, "F:\\testXmlToCsv\\outCsv", csvFileName);//调用生成csv文件的工具类
}
public static String fileUrl;
/**
* 测试方法
* @param args
*/
public static void main(String [] args) {
//调用解压文件类 实现解压(没装这个包,解压文件压缩包类型不知道,暂时不解压)
// UnGzip gzip = new UnGzip();
// Scanner scanner = new Scanner(System.in);
// System.out.print("请输入解析路径:");
// fileUrl = scanner.next();
// System.out.println("输入的路径为:"+fileUrl); //D:/SendFloder/MRO
// List<String> fileUrls = gzip.getAllFile(fileUrl); //解析的所有文件的路径
//获取文件夹下所有文件
File file = new File("F:\\testXmlToCsv");
String [] fileName = file.list();
for(String sss : fileName){
System.out.println(sss);
}
List<String> fileUrls = new ArrayList<>();
fileUrls.add("F:\\testXmlToCsv\\NR_MRO_HUAWEI_010231121007_3409785_20230327000000.xml");
//获取文件夹下所有文件
for (String fileAllUrl : fileUrls){
// ThreadPoolExecutorFactory.getInstance().run(() -> { //调用异步线程类
// gzip.unGzipFile(fileAllUrl); //解压所有文件
loadXmlImportCSV(fileAllUrl); //调用解析xml并导出csv的方法
// loadXmlImportCSV(fileAllUrl.substring(0,fileAllUrl.length()-3)); //调用解析xml并导出csv的方法
// gzip.delxmlfile(fileUrl,".xml"); //删除解压生成的xml文件
// });
}
}
}
//Header实体类 @Data 为get set方法注解,无此注解请手动添加get set 方法
package cc.mrbird.febs.util;
import lombok.Data;
@Data
public class Header {
private String endTime;
private String fileFormatVersion;
private String reportTime;
private String startTime;
private String aMFPointer;
private String aMFRegionID;
private String aMFSetID;
private String aMFUENGAPID;
private String timeStamp;
private String id;
private String aa;
private String bb;
private String cc;
private String dd;
private String ee;
private String ff;
private String gg;
private String hh;
private String ii;
private String jj;
private String kk;
private String ll;
private String mm;
private String nn;
private String oo;
private String pp;
private String qq;
private String rr;
private String ss;
private String tt;
private String uu;
private String vv;
private String ww;
// private String nRScSSRSRP;
// private String nRNcSSRSRP;
// private String nRScSSRSRQ;
// private String nRNcSSRSRQ;
// private String nRScSSSINR;
// private String nRNcSSSINR;
// private String nRScTadv;
// private String nRScPHR;
// private String nRScArfcn;
// private String nRScPci;
// private String nRNcArfcn;
// private String nRNcPci;
// private String lteNcRSRP;
// private String lteNcRSRQ;
// private String lteNcEarfcn;
// private String lteNcPci;
// private String hAOA;
// private String vAOA;
// private String nRUEPlrUL;
// private String nRUEPlrDL;
// private String pLMN;
// private String nRScSSBIndexId;
// private String nRNcSSBIndexId;
}
maven
<dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency>