在某些情况下,解析管道分隔的字符串,中间没有值

时间:2019-07-10 11:08:51

标签: java

我正在尝试分析一个包含由管道分隔的字符串的文件,该文件中应包含8列。但是在某些情况下,列数少于预期。在这种情况下,由于数组大小小于我的预期,我得到了ArrayIndexOutOfBoundsException

如何处理?如果没有数据,我总是想拥有相同的数组长度和空白值。

样本数据:

在下面的示例数据中,第一行按预期工作正常,但其他3行失败。

1-chloro-4-nitrobenzene|100-00-5||157.553 |NO2C6H4Cl||400|FID1GC/MSGCMS
geranyl butyrate|106-29-6||224.34|C14H24O2|||
4’-methoxyacetophenone|100-06-1||150.18|C9H10O2|||
p-Anisic Acid|100-09-4|152.047|152.149|C8H8O3||400|

结果

Invalid: column size : [5], line : geranyl butyrate|106-29-6||224.34|C14H24O2|||
Invalid: column size : [5], line : 4’-methoxyacetophenone|100-06-1||150.18|C9H10O2|||
Invalid: column size : [7], line : p-Anisic Acid|100-09-4|152.047|152.149|C8H8O3||400|

Java代码

     @Test
    public void testComponentsFileParsing3() {

        String fileName = "src/main/resources/admin/bulkupload_by_api/comp.txt";

        BufferedReader reader = null;
        try {

            reader = Files.newBufferedReader(Paths.get(fileName));
            String line = null;

            while ((line = reader.readLine()) != null) {

                String columns[] = line.split(Pattern.quote("|"));
                //String columns[] = StringUtils.split(line,"\\|");
                //String columns[] = line.split("\\|");

                String description = null;
                String code = null; // code & cas number are same
                String casNumber = null; // code & cas number are same
                String accurateMass = null;
                String molecularWeight = null;
                String molecularFormula = null;
                String ozoneDepletingSubstance = null;
                int estimatedShelfLife = 0;
                String technique = null;


                try {
                    description = columns[0];
                    code = columns[1]; // code & cas number are same
                    casNumber = columns[1]; // code & cas number are same
                    accurateMass = columns[2];
                    molecularWeight = columns[3];
                    molecularFormula = columns[4];
                    ozoneDepletingSubstance = columns[5];
                    estimatedShelfLife = NumberUtils.toInt(columns[6]);
                    technique = columns[7];

                } catch (ArrayIndexOutOfBoundsException ae) {
                    System.out.println("Invalid: column size : [" + columns.length + "], line : " + line);
                    continue;
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

1 个答案:

答案 0 :(得分:4)

这是根据docs预期的:

  

此方法的工作方式就像通过调用具有给定表达式且限制参数为零的二参数拆分方法。因此,结尾的空字符串不包含在结果数组中。

您可以调用带有限制= {{1}的two-argument variant来将所有尾随的空元素包括在结果中,或者可以使用带有限制= -1(或任何您期望的列数是) )是否更适合您的情况。

无论哪种方式,您都应该在之后检查实际的数组长度,以捕获任何错误的输入。