使用字符串数组的值填充用户定义对象的最佳方法

时间:2017-10-17 20:46:46

标签: java arrays string

我正在阅读两个不同的csv文件并将数据填充到两个不同的对象中。我正在基于正则表达式拆分每行csv文件(正则表达式对于两个csv文件是不同的)并使用该数组的每个数据填充对象,该数据是通过使用正则表达式拆分每一行获得的,如下所示:

public void check() throws IOException {

Finder finder = new Finder();
File[] files = finder.findTxtFiles("folder");

Map<String, List<String>> painters = new HashMap<String, List<String>>();


    for(File file : files){
        List<String> titles = new ArrayList<>();

        BufferedReader bufferedReader = 
        Files.newBufferedReader(Paths.get(file.getPath()), 
        StandardCharsets.ISO_8859_1);
        String painterName = bufferedReader.readLine();
        bufferedReader.readLine();

        while(bufferedReader.readLine() != null) {
           titles.add(bufferedReader.readLine());
        }
        painters.put(painterName,titles);
    }
}

csv文件如下: 一世。用于填充ABC对象的csv文件:

public static <T> List<T> readCsv(String filePath, String type) {
List<T> list = new ArrayList<T>();
    try {
        File file = new File(filePath);
        FileInputStream fileInputStream = new FileInputStream(file);
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader)
        list = bufferedReader.lines().skip(1).map(line -> {
            T obj = null;
            String[] data = null;
            if (type.equalsIgnoreCase("Student")) {
                data = line.split(",");
                ABC abc = new ABC();
                abc.setName(data[0]);
                abc.setRollNo(data[1]);
                abc.setMobileNo(data[2]);
                obj = (T)abc;
            } else if (type.equalsIgnoreCase("Employee")) {
                data = line.split("\\|");
                XYZ xyz = new XYZ();s
                xyz.setName(Integer.parseInt(data[0]));
                xyz.setCity(data[1]);
                xyz.setEmployer(data[2]);
                xyz.setDesignation(data[3]);
                obj = (T)xyz;
            }

            return obj;
        }).collect(Collectors.toList());} catch(Exception e) {

    }}

II。用于填充XYZ对象的csv文件

Name,rollNo,mobileNo
Test1,1000,8888888888
Test2,1001,9999999990

问题是csv文件中的任何上述列都可能缺少数据,如第二个csv文件中所示。在这种情况下,我将获得ArrayIndexOutOfBounds异常。 任何人都可以让我知道使用字符串数组的数据填充对象的最佳方法是什么?

提前致谢。

2 个答案:

答案 0 :(得分:0)

除了您在评论中指出的其他错误之外,您的实际问题是由line.split("\\|")调用line.split("\\|", 0)导致丢弃尾随的空字符串引起的。您需要使用line.split("\\|", -1)来调用它,它会起作用。

答案 1 :(得分:0)

问题似乎是任何给定CSV行上的一个或多个 last 值可能为空。在这种情况下,您会遇到String.split(String)抑制尾随空字符串的事实。

假设你可以依赖所有 present 的字段,即使是空的,你也可以简单地使用split()的两个arg形式:

data = line.split(",", -1);

您可以在that method's API docs中找到详细信息。

如果您无法确信这些字段是否存在,那么您可以通过在输入字符串的末尾添加分隔符来强制它们:

data = (line + ",,").split(",", -1);

由于您只使用少量值的第一个值,因此将忽略额外分隔符引入的任何额外尾随值。