读写csv文件——考虑各种异常场景,源码
CSV是以逗号间隔的文本文件,其文件以纯文本形式存储表格数据(数字和文本)。在JAVA中可以通过输出文件流的方式将数据写入CSV文件,通过BufferedReader类去读该路径中的文件,使用readLine方法进行逐行读取。
- 写csv文件需要注意:
1、如果需要重复写文件,需要考虑删除已经存在的文件。
- 读csv文件需要注意:
1、文件路径是否存在
2、文件表头是否正确,考虑兼容性问题时,只需要考虑是否存在需要的列即可
第一步:创建一个对象类
package testCSV; public class Person {
private String id;
private String name;
private String sex;
private int age; public Person() {
} public Person(String id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}
第二步:写和读csv文件
package testCSV; import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; public class FileCsv {
private static final String fileName = "D:\\workspace\\tmp\\obj.csv";
private static final String CSV_SPLIT = ",";
private static int idIndex = -1;
private static int nameIndex = -1;
private static int sexIndex = -1;
private static int ageIndex = -1; /**
* 生成uuid
*
* @return 32位uuid
*/
private static String getUUID32() {
return UUID.randomUUID().toString().replace("-", "").toLowerCase();
} /**
* 构造数据
*
* @return 数据
*/
private static List<Person> buildData() {
List<Person> personList = new ArrayList<Person>(10);
personList.add(new Person(getUUID32(), "张三", "female", 26));
personList.add(new Person(getUUID32(), "李四", "man", 34));
personList.add(new Person(getUUID32(), "王五", "female", 55));
personList.add(new Person(getUUID32(), "一一", "female", 11));
return personList;
} /**
* 写csv文件
*
* @return 文件名
*/
public static String writeCsv() {
File file = new File(fileName);
if (null != file && file.exists()) {
file.delete();
}
List<Person> personList = buildData();
FileOutputStream out = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
out = new FileOutputStream(file);
osw = new OutputStreamWriter(out, "UTF-8");
bw = new BufferedWriter(osw);
String title = "ID,NAME,SEX,AGE\r";
bw.append(title); for (Person data : personList) {
bw.append(data.getId());
bw.append(CSV_SPLIT);
bw.append(data.getName());
bw.append(CSV_SPLIT);
bw.append(data.getSex());
bw.append(CSV_SPLIT);
bw.append(String.valueOf(data.getAge()));
bw.append("\r");
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (bw != null) {
try {
bw.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
if (osw != null) {
try {
osw.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
return fileName;
} /**
* 表头正确性校验
*
* @param titleInfo 表头
* @return
*/
private static Boolean checkTitle(String titleInfo) {
if (null == titleInfo || titleInfo.isEmpty()) {
return false;
}
String[] titles = titleInfo.split(CSV_SPLIT);
for (int i = 0; i < titles.length; i++) {
String titleName = titles[i];
if (titleName.equals("ID")) {
idIndex = i;
continue;
}
if (titleName.equals("NAME")) {
nameIndex = i;
continue;
}
if (titleName.equals("SEX")) {
sexIndex = i;
continue;
}
if (titleName.equals("AGE")) {
ageIndex = i;
continue;
}
}
if (idIndex == -1
|| nameIndex == -1
|| sexIndex == -1
|| ageIndex == -1) {
return false;
}
return true;
} /**
* 读取csv文件
*
* @return 数据
*/
private static List<Person> readCsv() {
File file = new File(fileName);
if (null == file) {
return new ArrayList<Person>();
}
if (!file.exists()) {
return new ArrayList<Person>();
}
BufferedReader bufferedReader = null;
List<Person> personList = new ArrayList<Person>(10);
try {
bufferedReader = new BufferedReader(new FileReader(file));
if (!checkTitle(bufferedReader.readLine())) {
return new ArrayList<Person>();
}
String line = "";
while (null != (line = bufferedReader.readLine())) {
String[] personInfo = line.split(CSV_SPLIT);
Person person = new Person();
person.setId(personInfo[idIndex]);
person.setName(personInfo[nameIndex]);
person.setSex(personInfo[sexIndex]);
person.setAge(Integer.parseInt(personInfo[ageIndex]));
personList.add(person);
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
try {
bufferedReader.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
return personList;
} public static void main(String[] args) {
writeCsv();
List<Person> personList = readCsv();
for (int i = 0; i < personList.size(); i++) {
Person person = personList.get(i);
System.out.println("id=" + person.getId()
+ ",name=" + person.getName()
+ ",sex=" + person.getSex()
+ ",age=" + String.valueOf(person.getAge()));
}
}
}
结果验证:
写文件读文件
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!
读写csv文件——考虑各种异常场景,源码的更多相关文章
- 使用Python读写csv文件的三种方法
Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是 ...
- python读写csv文件
文章链接:https://www.cnblogs.com/cloud-ken/p/8432999.html Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗 ...
- 用opencsv文件读写CSV文件
首先明白csv文件长啥样儿: 用excel打开就变成表格了,看不到细节 推荐用其它简单粗暴一点儿的编辑器,比如Notepad++, csv文件内容如下: csv文件默认用逗号分隔各列. 有了基础的了解 ...
- python3读写csv文件
python读取CSV文件 python中有一个读写csv文件的包,直接import csv即可.利用这个python包可以很方便对csv文件进行操作,一些简单的用法如下. 1. 读文件 csv_ ...
- 利用JavaCSV API来读写csv文件
http://blog.csdn.net/loongshawn/article/details/53423121 http://javacsv.sourceforge.net/ 转载请注明来源-作者@ ...
- 使用 Apache Commons CSV 读写 CSV 文件
有时候,我们需要读写 CSV 文件,在这里给大家分享Apache Commons CSV,读写 CSV 文件非常方便. 具体官方文档请访问Apache Commons CSV. 官方文档已经写得很详细 ...
- python3使用csv包,读写csv文件
python操作csv,现在很多都用pandas包了,不过python还是有一个原始的包可以直接操作csv,或者excel的,下面举个例子说明csv读写csv文件的方法: import os impo ...
- C/C++读写csv文件
博客转载自:http://blog.csdn.net/u012234115/article/details/64465398 C++ 读写CSV文件,注意一下格式即可 #include <ios ...
- JAVA读写CSV文件
最近工作需要,需要读写CSV文件的数据,简单封装了一下 依赖读写CSV文件只需引用`javacsv`这个依赖就可以了 <dependency> <groupId>net.sou ...
随机推荐
- “全栈2019”Java多线程第六章:中断线程interrupt()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第八十九章:接口中能定义内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 动态代理(JDK实现)
JDK动态代理,针对目标对象的接口进行代理 ,动态生成接口的实现类 !(必须有接口) public class ProxyDemo { //通过方法的返回值得到代理对象 方法参数 ...
- [网络] DHCP 之 Mac 绑定
[网络] DHCP 之 Mac 绑定 一.瞎扯 今天我们来简单聊聊Mac绑定,这在设备管理时常常被使用. 当然你可能会说我可以设置静态IP啊.先不提静态IP容易冲突.现在我在设置树莓派时就遇到一个问题 ...
- 记一次升级Ubuntu内核
uname -a 查看当前使用内核版本 升级指定内核 apt-get install linux-image-4.4.0-131-generic dpkg --get-selections | ...
- graphviz画图与中文乱码等问题总结
最近想写一些文档,画一些程序的逻辑图,用了vision,markdown等软件感觉不怎么好用,于是找到graphviz,这款强大的软件.下面介绍一些入门,还有自己在用的过程中遇到的问题 1.中文乱码的 ...
- leetcode-292-Nim Game(搬石子)
题目描述: You are playing the following Nim Game with your friend: There is a heap of stones on the tabl ...
- opencv 将视频分解成图片和使用本地图片合成视频
代码如下: // cvTest.cpp : Defines the entry point for the console application. #include "stdafx.h&q ...
- 一款开源免费的办公套件系统:DzzOffice详细部署
一.系统环境 个人建议centos 7 系统 cat /etc/redhat-release CentOS Linux release (Core) 基本更新 yum update -y 基本优化 关 ...
- C#枚举类型转换
string 转 enum (自己定义的枚举类型)(Enum.Parse(typeof(自己定义的枚举类型), 待转字符串)); enum 转 string enum.Getname(typeof(自 ...