CSV文件简介
Comma Separated Values,简称CSV,即逗号分隔值,是一种纯文本格式,用来存储数据。在CSV中,数据的字段由逗号分开。CSV文件是一个计算机数据文件用于执行审判和真正的组织工具,逗号分隔的清单。常常被用于移动表格数据之间的两个不同的计算机程序,例如关系数据库程序和电子表格程序。建议用记事本新建一个文件然后修改后缀名,也建议用记事本打开CSV文件。用Excel打开,有时候会报错。
要求说明
图1 数据
图2 树结构图
图3 处理后的树
现在树只有3、6、10、12、14、15六个节点。关系如下:
3——10
6——3
10——0
12——10
14——10
15——14
按照原始格式输出数据,如图4。
1.根据图1中的C列和I列数据构建树。
2.每个节点具体值至少包含H列的0、1数据。
3.删除树中0节点数据。如果0节点是叶子节点,直接删除即可。如果0节点是非叶子节点,且其子孙节点中有1节点,则删除0节点后,连接其父节点中1节点和子孙节点中的1节点。
简言之,要求就是删除树中所有0节点,并连接0节点上下的1节点。构建一棵只含有1节点的树。
类似treelib里面的move_node的功能。
代码实现
public class TreeNode {
String lan;
String sen;
String deptID;
String dep;
String dep_orig;
String dep_POS1;
String dep_POS2;
String xushi_1;
String he_ID;
String he;
String he_orig;
String he_POS1;
String he_POS2;
String xushi_2;
String type;
boolean visited;
boolean saved;
....get/set方法省略
}
public class TreeTest {
public static void main(String src[]){
try{
//创建输出文件的头部 csv默认编码方式gbk
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d://result.csv",true), "GBK"));
out.write("lan,sen,depID,dep,dep_orig,dep_POS1,dep_POS2,xushi,he_ID,he,he_orig,he_POS1,he_POS2,xushi,type");
out.newLine();
out.flush();
out.close();
}
catch (Exception e){
}
//读取csv文件
List<List<TreeNode>> trees = new ArrayList<List<TreeNode>>();
try {
BufferedReader reader = new BufferedReader(new FileReader("d://aa.csv"));//换成你的文件名
reader.readLine();//读取第一行信息,标题信息。如果需要,则注释掉
String line = null;
List<TreeNode> tree = new ArrayList<TreeNode>();
while((line=reader.readLine())!=null){
String item[] = line.split(",");//CSV格式文件为逗号分隔符文件,这里根据逗号切分
try{
String child = item[2];
if(child.equals("EOS")){//以EOS结束
trees.add(tree);
tree = new ArrayList<TreeNode>();
}
String parent = item[8];//这就是你要的数据了
TreeNode info = new TreeNode();
info.setLan(item[0]);
info.setSen(item[1]);
info.setDeptID(item[2]);
info.setDep(item[3]);
info.setDep_orig(item[4]);
info.setDep_POS1(item[5]);
info.setDep_POS2(item[6]);
info.setXushi_1(item[7]);
info.setHe_ID(item[8]);
info.setHe(item[9]);
info.setHe_orig(item[10]);
info.setHe_POS1(item[11]);
info.setHe_POS2(item[12]);
info.setXushi_2(item[13]);
info.setType(item[14]);
info.setVisited(false);
tree.add(info);
}catch (Exception e0){//当读到最后一行的时候,由于只有两项值,所以会报错。进入catch中,在catch中读取最后一行的数据
try{
TreeNode info = new TreeNode();
info.setLan(item[0]);
info.setSen(item[1]);
info.setDeptID(item[2]);
info.setVisited(false);
tree.add(info);
}catch(Exception e){
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
//写入csv文件
for(List<TreeNode> tree: trees){
// 查询 0节点的位置所在
// 根节点
TreeNode root = new TreeNode();
root.setDeptID("0");
Stack<TreeNode> stacks = new Stack<TreeNode>();
while(root!=null){
try{
TreeNode child = root;
List<TreeNode> childs = tree.stream().filter(item -> item.getHe_ID().equals(child.getDeptID()) && !item.isVisited()).collect(Collectors.toList());
if(childs.size()==0){
root =stacks.pop();
TreeNode pop= root;
//System.out.println(root.getDeptID()+"出栈");
// 出栈行为:
// 是否是叶节点
List<TreeNode> boys = tree.stream().filter(item -> item.getHe_ID().equals(pop.getDeptID())).collect(Collectors.toList());
// 叶节点
if(boys.size()==0){
if(pop.getXushi_1().equals("1")){
pop.setSaved(true);
}else{
// 直接扔掉
pop.setSaved(false);
}
}
// 枝节点
else{
if(pop.getXushi_1().equals("1")){
pop.setSaved(true);
}else{
// 把你扔掉
pop.setSaved(false);
// 并且将你的父亲传递给子代
// 杀人诛心
for(TreeNode boy:boys){
if(boy.getXushi_1().equals("1")){
boy.setHe_ID(pop.getHe_ID());
}
}
}
}
continue;
}
for(TreeNode node : childs){
if(!node.isVisited()){
node.setVisited(true);
stacks.push(node);
}
}
root = stacks.lastElement();
}catch(Exception e){
List<TreeNode> childs = tree.stream().filter(item -> item.isSaved()).collect(Collectors.toList());
try {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d://result.csv",true), "GBK"));
for (TreeNode child : childs) {
System.out.println(child.toString());
String value = child.getLan();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getSen();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getDeptID();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getDep();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getDep_orig();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getDep_POS1();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getDep_POS2();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getXushi_1();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getHe_ID();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getHe();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getHe_orig();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getHe_POS1();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getHe_POS2();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getXushi_2();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
value = child.getType();
if(value!=null){
out.write(value);
out.write(",");
}
else{
out.newLine();
continue;
}
out.newLine();
}
out.write(childs.get(0).getLan()+","+childs.get(0).getSen()+",EOS");
out.newLine();
out.flush();
out.close();
}
catch (Exception e0) {
System.out.println(e0);
}
break;
}
}
System.out.println("-------------------------");
}
}
}