【问题标题】:Best way to populate a user defined object using the values of string array使用字符串数组的值填充用户定义对象的最佳方法
【发布时间】:2017-10-17 20:46:46
【问题描述】:

我正在读取两个不同的 csv 文件并将数据填充到两个不同的对象中。我正在根据正则表达式拆分 csv 文件的每一行(两个 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) {

    }}

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

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

二。 csv 文件填充 XYZ 对象

Name|City|Employer|Designation
Test1|City1|Emp1|SSE
Test2|City2|Emp2|

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

提前致谢。

【问题讨论】:

  • 另一个问题是type == "Employee" 不会像您期望的那样工作。 type.equals("Employee") 应该是这样写的(假设type 不能为空)。
  • "Employee".equals(type),如果它可以为空。还有一些与忽略大小写相关的方法。
  • Objects.equals("Employee", type),如果它可以或不能为空。
  • 您说任何列的数据都可能丢失,但这是否意味着连管道分隔器都丢失了?如果是这样,第 4 列的数据在技术上是否可以排在第 3 位,等等?如果可能的话,我不知道你怎么能相信你得到的数据。

标签: java arrays string


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    假设你可以依赖所有实际存在的字段存在,即使是空的,你也可以简单地使用split()的两个参数形式:

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

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

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

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

    由于您只使用前几个值,因此额外分隔符引入的任何额外尾随值都将被忽略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多