当前位置: 首页 > 工具软件 > CSV.swift > 使用案例 >

Csvmapper操作csv文件

司寇凯
2023-12-01

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() {
	}
}

 类似资料: