Csvmapper操作csv文件

    技术2023-06-18  81

    csv文件上传/读取/压缩/保存

    import com.fasterxml.jackson.dataformat.csv.CsvMapper; import com.fasterxml.jackson.dataformat.csv.CsvSchema; import com.fasterxml.jackson.databind.SequenceWriter; import com.fasterxml.jackson.dataformat.csv.CsvGenerator; public String upload(Model model, HttpServletRequest request, @RequestParam("uploadFile") MultipartFile file , @AuthenticationPrincipal LoginUserDetails userDetails) { // 文字コード設定 Reader reader = new InputStreamReader(file.getInputStream(), "Shift_JIS"); //这个model是普通的实体类,没任何特别的东西 Field[] fields = MyModel.class.getDeclaredFields(); //把model的信息加入到CsvSchema中 CsvSchema.builder().addColumn(fields[0].getName(), CsvSchema.ColumnType.STRING) .addColumn(fields[1].getName(), CsvSchema.ColumnType.STRING) .addColumn(fields[2].getName(), CsvSchema.ColumnType.STRING) .build(); CsvMapper csvMapper = new CsvMapper(); MappingIterator<Object> readValues = csvMapper.readerFor(MyModel.class) .with(csvSchema.withHeader())//不读取上传文件的表头 .readValues(reader); //項目数が超える場合は。以下、CSVMappingExceptionを自動的にThrow、catch側にゲット List<Object> modelList = readValues.readAll(); List<FileModel> fileModelList = new ArrayList<>(); modelList.forEach(item ->{ //データ操作... MyModel myModel= (MyModel) item; FileModel fileModel= new FileModel (); fileModel.setInfo1(item.getInfo1()); fileModel.setInfo2(item.getInfo2()); fileModel.setInfo3(item.getInfo3()); fileModelList.add(fileModel); }); //ファイル作成 CsvMapper csvMapper = new CsvMapper();  csvMapper.configure(CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS, true);//数据之间双引号设置打开  CsvSchema csvSchema = csvMapper.schemaFor(FileModel.class);//model的信息    //文件每1000条数据就分割一个文件,这个是计算需要输出几个文件  int size = fileModelList.size();  int fileCreateCount = size % config.get1000() == 0 ? (size / config.get1000()) : (size / config.get1000()) + 1; // 1000件以上の実行 //文件保存的位置List,后面根据这个list把出力的临时文件进行压缩zip化,把压缩后不用的临时文件删除 //后面就不详细写了 List<File> filesInfoList = new ArrayList<>(); String filePath = "c.\\test.csv";//设置你要保存地址,根据自己做修改 for (int i = 1; i < fileCreateCount; i++) { File file = new File(filePath); filesInfoList.add(file);//后面压缩文件用的 Path path = Paths.get(filePath); try (BufferedWriter bw = Files.newBufferedWriter(path, Charset.forName("Shift_JIS")); SequenceWriterwriter=csvMapper .writer(csvSchema.withHeader().withLineSeparator("\r\n"))//每行用CRLF分行 .writeValues(bw)) { // Tag を使ています // csvSchema.withColumnSeparator('\t') //先取list中的1000件,每输出1000件就删除掉这个list对应的1000件 List<FileModel> subList = fileModelList.subList(0, config.get1000()); for (FileModel model : subList) { writer.write(model); } } catch (IOException e) { log.warn("stream writer error"); this.serviceFileDelete(filesInfoList); } // 出力したの項目を削除 出力过的1000件删除 fileModelList.subList(0, config.get1000()).clear(); } // 1000件以内または残り件数の処理 1000件以内或者剩余文件不足1000的时候 Path path = Paths.get(filePath); try (BufferedWriter bw = Files.newBufferedWriter(path, Charset.forName("Shift_JIS")); SequenceWriter writer = csvMapper.writer(csvSchema.withHeader().withLineSeparator("\r\n")) .writeValues(bw)) { // Tag を使ています // csvSchema..withColumnSeparator('\t') for (FileModel model : fileModelList) { writer.write(model); } // ファイル圧縮 文件压缩 File zipFile = new File("c:\\test.zip"); OutputStream outputStream = new FileOutputStream(zipFile); FileToZipUtils.toZip(filesInfoList, outputStream); // ファイル保存 保存到AWS s3中 try (InputStream inputStream = new FileInputStream(zipFile)) { //这个方法在AWS存储文章中记载 this.fileSave(); } }
    保存用的实体类设置:输出文件表头设置
    import java.io.Serializable; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.Data; //@JsonPropertyOrder和@JsonProperty设置一个就可以了 @Data @JsonPropertyOrder({ "インフォ1", "インフォ2", "インフォ3" }) public class FileModel implements Serializable { private static final long serialVersionUID = 1L; @JsonProperty("インフォ1") private String info1; @JsonProperty("インフォ2") private String info2; @JsonProperty("インフォ3") private String info3; }
    文件压缩工具类/zip化
    import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import lombok.extern.slf4j.Slf4j; /** * * @ClassName: FileToZipUtils * */ @Slf4j public class FileToZipUtils { public static void toZip(List<File> srcFiles, OutputStream out) throws IOException { long start = System.currentTimeMillis(); try (ZipOutputStream zos = new ZipOutputStream(out)) { for (File srcFile : srcFiles) { byte[] buf = new byte[512]; zos.putNextEntry(new ZipEntry(srcFile.getName())); int len; try(FileInputStream in = new FileInputStream(srcFile)){ while ((len = in.read(buf)) != -1) { zos.write(buf, 0, len); } zos.closeEntry(); } } long end = System.currentTimeMillis(); log.info("to Zip:OK" + (end - start) + " ms"); } } private FileToZipUtils() { } }
    Processed: 0.038, SQL: 9