Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中读取多个不同格式的csv文件_Java_Spring Boot - Fatal编程技术网

如何在java中读取多个不同格式的csv文件

如何在java中读取多个不同格式的csv文件,java,spring-boot,Java,Spring Boot,我正在使用watchservice实现csv文件侦听器。我的要求是: 使用java watch服务从注册目录获取csv文件。我正在努力处理接收到的文件并将数据存储到数据库中。这里的问题是-CSV文件格式不是预定义的,文件可以有任意数量的列和不同的标题。我参考了很多网站,但没有找到任何解决方案。请提供帮助。此示例代码帮助您处理文件: import java.util.ArrayList; import java.util.HashMap; import java.util.List; import

我正在使用watchservice实现csv文件侦听器。我的要求是:
使用java watch服务从注册目录获取csv文件。我正在努力处理接收到的文件并将数据存储到数据库中。这里的问题是-CSV文件格式不是预定义的,文件可以有任意数量的列和不同的标题。我参考了很多网站,但没有找到任何解决方案。请提供帮助。

此示例代码帮助您处理文件:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    private static String HEADER_DELIMITER = ",";
    private static String DATA_DELIMITER = ",";

    public static void main(String[] args) {
        /**
         * for each file read lines and then ...
         */
        String headerLine = "id,name,family";
        String[] otherLines = { "1,A,B", "2,C,D" };
        List<Student> students = new ArrayList<Student>();
        String[] titles = headerLine.split(HEADER_DELIMITER);
        for (String line : otherLines) {
            String[] cells = line.split(DATA_DELIMITER);
            Student student = new Student();
            int i = 0;
            for (String cell : cells) {
                student.add(titles[i], cell);
                i++;
            }
            students.add(student);
        }
        System.out.println(students);
        /*
         * output:
         * [Student [data={id=1, family=B, name=A}], Student [data={id=2, family=D, name=C}]]
         */

        /**
         * save students in your table.
         */
    }

    static class Student {
        Map<String, String> data = new HashMap<String, String>();

        public void add(String key, String value) {
            data.put(key, value);
        }

        @Override
        public String toString() {
            return "Student [data=" + data + "]";
        }
    }
}
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公共班机{
私有静态字符串头_分隔符=“,”;
私有静态字符串数据_分隔符=“,”;
公共静态void main(字符串[]args){
/**
*对于每个文件,读取行,然后。。。
*/
String headerLine=“id,name,family”;
字符串[]其他行={“1,A,B”,“2,C,D”};
List students=new ArrayList();
String[]titles=headerLine.split(标题分隔符);
用于(字符串行:其他行){
String[]cells=line.split(数据分隔符);
学生=新生();
int i=0;
用于(字符串单元格:单元格){
添加(标题[i],单元格);
i++;
}
学生。添加(学生);
}
系统输出打印(学生);
/*
*输出:
*[Student[data={id=1,family=B,name=A}],Student[data={id=2,family=D,name=C}]
*/
/**
*把学生留在你的桌子上。
*/
}
静态班学生{
映射数据=新的HashMap();
公共void添加(字符串键、字符串值){
数据输入(键、值);
}
@凌驾
公共字符串toString(){
返回“Student[data=“+data+”]”;
}
}
}
要将结果保存到数据库中,这取决于您对数据模型的决定。例如,如果这些csv文件在大多数列中都很常见,但在少数列中有所不同,我建议使用以下数据模型:

您应该有一个包含公共列(id、名称、族)的表(例如Student),另一个表只有3列(studentForeignKey、key、value),并在此表中存储其他额外列。例如(id=1,key=activity,value=TA),这意味着id=1的学生有TA活动


我希望这个答案能帮助您

您能分享到目前为止您已经尝试过的代码吗?如果文件格式完全是任意的,您就不能用通用代码来有意义地处理它。您可以做的一件事是手动逐行解析文件,并在
上拆分,然后在无限循环中进行解析,直到到达文件末尾。