源码链接:https://me.csdn.net/download/qq_17033579
原文件CSV.txt 文件内容如下:
1,Jane,"下棋,""飞""",56.2,1976-8-23
2,Kate,购物,49.6,1979-12-56
3,Jerry,"羽毛球,爬山",55.6,1980-5-26
要求数据处理为:
要求:
1 将每行字符串按照逗号分割成5个字段,考点:字段中含逗号
第一列转为整形(int)
第二列为字符串型
第三列为字符串型
第四列转为浮点数(float)
第五列转为日期类型(DateTime)
输出文件的字段以制表符 [TAB] 来分割字段,
字符串字段输出时用单引号[’]括起来
日期字段显示成 YYYY/MM/DD 的格式
说明:
1、可以假设字段值只包含单行数据,即字段值本身不含有 [回车换行]
2、不能对文件 csv.txt 作任何修改
编程要求:
- 不允许用任何既有的 CSV 解析库
- 使用任何你熟悉的编程语言编写,时间为 1.5 小时。
写入新文件内容如下:
1 'Jane' '下棋,飞' 56.2 1975/12/28
2 'Kate' '购物' 49.6 1978/12/31
3 'Jerry' '羽毛球,爬山' 55.6 1979/12/30
1 ) 看到网上有好多写入磁盘的文件打开都是乱码,这次自己整理了一个写入磁盘后不会是乱码的备忘,读写文件操作:
package com.msyd.dbet.stu;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ReadWritetest {
private static final Log logger = LogFactory.getLog(ReadWritetest.class);
private static final String fileName = "D:/1/csv.txt";
private static final String fileName2 = "D:/1/csv2.txt";
public static void main(String[] args) {
//获取文件内容,读文件
BufferedReader br = null;
List<CVS> list = new ArrayList<CVS>();
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "utf-8")); //这里可以控制编码
String line = null;
String[] linearry = null;
CVS c = null;
while ((line = br.readLine()) != null) {
linearry = StringUtilSplit.commaDivider(line);
c = new CVS();
//组装对象到对应数据类型
c.setA_int(Integer.parseInt(linearry[0]));
c.setB_str("'" + linearry[1] + "'");
c.setC_str("'" + linearry[2] + "'");
c.setD_float(Float.parseFloat(linearry[3]));
c.setE_date(DateUtil.getYMD(DateUtil.stringToDate(linearry[4], "YYYY-MM-DD")));
list.add(c);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//写入文件
writeFile(list);
}
//写入文件
public static void writeFile(List<CVS> list) {
File file = new File(fileName2);
BufferedWriter bw = null;
try {
if (!file.exists()) { // 只处理不存在的文件
logger.info("开始创建新文件。" + fileName2);
file.createNewFile();// 文件不存在就新建一个文件出来
bw = new BufferedWriter(new FileWriter(file));// 生成一个新文件
int count = 0;
for (CVS c : list) {
String line = c.toString();
bw.write(line);
bw.newLine();
bw.flush();
count++;
}
logger.info("共写入" + count + "条");
}
} catch (IOException e) {
logger.info("IO流异常", e);
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
logger.info("IO流关闭异常", e);
}
}
}
}
}
1)pom文件配置:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.45</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
2)定义一个对象用来接收读取的磁盘数据
package com.msyd.dbet.stu;
public class CVS implements java.io.Serializable {
private int a_int;
private String b_str;
private String c_str;
private Float d_float;
private String e_date;
public CVS() {
}
public CVS(int a_int, String b_str, String c_str, Float d_float, String e_date) {
super();
this.a_int = a_int;
this.b_str = b_str;
this.c_str = c_str;
this.d_float = d_float;
this.e_date = e_date;
}
public int getA_int() {
return a_int;
}
public void setA_int(int a_int) {
this.a_int = a_int;
}
public String getB_str() {
return b_str;
}
public void setB_str(String b_str) {
this.b_str = b_str;
}
public String getC_str() {
return c_str;
}
public void setC_str(String c_str) {
this.c_str = c_str;
}
public Float getD_float() {
return d_float;
}
public void setD_float(Float d_float) {
this.d_float = d_float;
}
public String getE_date() {
return e_date;
}
public void setE_date(String e_date) {
this.e_date = e_date;
}
@Override
public String toString() {
return "\t" + a_int + "\t" + b_str + "\t" + c_str + "\t" + d_float + "\t" + e_date + "\r\n";
}
}
3)负责将文件里时间字段转义格式的工具类
package com.msyd.dbet.stu;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
public static String getYMD(Date date) {
String strYMD = "";
//Date currentDateTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
strYMD = formatter.format(date);
return strYMD;
}
/***
* 字符串转化为日期类型
* @dateFormat "yyyyMMdd"
* @param str
* @return
*/
public static Date stringToDate(String str, String dateFormat) {
SimpleDateFormat format = new SimpleDateFormat(dateFormat);
Date date = null;
try {
// Fri Feb 24 00:00:00 CST 2012
date = format.parse(str);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
}
4)通过逗号分割字符串,但是字段内含逗号
package com.msyd.dbet.stu;
import java.util.ArrayList;
import java.util.List;
public class StringUtilSplit {
/**通过逗号分割字符串,但是字段内含逗号*/
public static void main(String[] args) {
String a = "3,Jerry,\"羽毛球,爬山\",55.6,1980-5-26";
String[] aa = commaDivider(a);
System.out.println(aa[2]);
}
/**
* Java字符串逗号分割解析方法
* 本专门针对双引号中还有逗号或者某个字段无双引号的情况而设计的
* 例如要将字符串String sss="101,\"a\",\"中国,江苏\",\"b\",\"中国,北京\",1,0,\"c\""按照逗号进行分割解析
* 正确的split的结果是 (101)(a)( 中国,江苏) ( b)( 中国,北京) ( 1)( 0)( c)
* 如果用java的split方法的话,当遇到(中国,北京)这些字段值时就会多分割了一个字段出来,就不正确了
* 同时,上面的101 ,1,0都不带要双引号,我们期望的理想字符串当然都是带双引号的字段值组成的字符串了
* 来自大学课本数据结构中的提到的,
* 方法执行的效率没有测试
* @author HsuChan
* @version 2014-11-30 22:30
* @param sss
* @return String []
*/
public static String[] commaDivider(String sss) {
//双引号开始标记
int qutationStart = 0;
//双引号结束标记
int qutationEnd = 0;
char[] charStr = sss.toCharArray();
//用于拼接字符 作为一个字段值
StringBuffer sbf = new StringBuffer();
//结果list
List<String> list = new ArrayList<String>();
//逐个字符处理
for (int i = 0; i < charStr.length; i++) {
//在此之前还未遇到双引号并且当前的字符为\"
if (qutationStart == 0 && charStr[i] == '\"') {
qutationStart = 1;
qutationEnd = 0;
continue;
} else if (qutationStart == 1 && charStr[i] == '\"') {
//在此之前遇到了双引号并且当前的字符为\" 说明字段拼接该结束了
qutationStart = 0;
qutationEnd = 1;
//当最后一个字符是双引号时,由于下次循环不会执行,所以在此保存一下
if (i == charStr.length - 1 && sbf.length() != 0) {
list.add(sbf.toString());
sbf.setLength(0);
}
continue;
} else if (qutationStart == 1 && charStr[i] == ',' && qutationEnd == 0) {
//处理 \"中国,北京\"这种不规范的字符串
sbf.append(charStr[i]);
continue;
} else if (charStr[i] == ',') {
//字段结束,将拼接好的字段值存到list中
list.add(sbf.toString());
sbf.setLength(0);
continue;
}
//不属于分隔符的就拼接
sbf.append(charStr[i]);
if (i == charStr.length - 1 && sbf.length() != 0) {
list.add(sbf.toString());
sbf.setLength(0);
}
}
return (String[]) list.toArray(new String[list.size()]);
}
}