在Java中拆分一个字符串并将其插入一个空字符串

Posted

技术标签:

【中文标题】在Java中拆分一个字符串并将其插入一个空字符串【英文标题】:Split a string in Java and insert it into an empty string 【发布时间】:2021-11-16 02:07:45 【问题描述】:

我有一个包含以下数据的 CSV 文件:

20210903|0000000001|0081|A|T60|BSN|002|STATE UNITED

我已使用此代码在我的 java 应用程序中导入此文件:

public List<EquivalenceGroupsTO> read() throws FileNotFoundException, IOException 

    try (BufferedReader br = new BufferedReader(new FileReader("/home/myself/Desk/blaBla/T60.csv"))) 

        List<String> file = new ArrayList<String>();
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();
        Integer count = 0;
        HashSet<String> hset = new HashSet<String>();

        while (line != null) 
            //System.out.println("data <" + count + "> :" + line);
            count++;
            file.add(line);
            file.add("\n");
            line = br.readLine();
        

        EquivalenceGroupsTO equivalenceGroupsTO = new EquivalenceGroupsTO();

        List<EquivalenceGroupsTO> equivalenceGroupsTOs = new ArrayList<>();

        for (String row : file) 
            equivalenceGroupsTO = new EquivalenceGroupsTO();
            String[] str = row.split("|");
            equivalenceGroupsTO.setEquivalenceGroupsCode(str[5]);
            equivalenceGroupsTO.setDescription(str[7]);
            equivalenceGroupsTO.setLastUpdateDate(new Date());
            equivalenceGroupsTOs.add(equivalenceGroupsTO);
            System.out.println("Tutto ok!");
        
        return equivalenceGroupsTOs;
    

我需要在 equivalenceGroupsTO.setEquivalenceGroupsCodeequivalenceGroupsTO.setDecription (它们是字符串)中分别设置第五个和第七个“|”之后的字符串,然后是“BSN”和“STATE UNITED”。

但是如果我启动这个脚本,它会给我这个错误:

java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 1
at it.utils.my2.read(OpenTXTCodifa.java:46)

我做错了什么?

【问题讨论】:

你想要:String[] str = row.split("\\|"); 做一些基本的调试。 “|”是正则表达式的特殊字符。我写了一个简单的单行测试代码来证明这一点:System.out.println( "1|2|3".split("|").length ); 它显示“5”。使用上述建议转义“|”我得到了“3”,这是正确的。因此,鉴于您的代码认为您在数组中只有一个值,您还有其他一些问题。为什么要将“\n”重新添加到 ArrayList 中?为什么你甚至有一个 ArrayList?只需在从文件中读取文本时处理每一行文本。 正如人们在上面所说的那样,绝大多数代码都是多余的。创建您的 List equivalenceGroupsTOs = new ArrayList(); 并在 "\\|" 上拆分并在循环中添加到 List 然后返回它 【参考方案1】:

cmets 中提到了主要问题:当使用| 字符分割时,必须将其转义为\\|,因为管道字符在常规表达式中是用户作为 OR 运算符。

下一个问题是将仅包含\n 的行添加到file。拆分此行时,str[5] 将失败并显示ArrayIndexOutOfBoundsException

其他小问题是未使用的变量counthset

但是,最好重构现有代码,使用 NIO 和 Stream API 来获取行流并将每一行转换为 EquivalenceGroupsTO 的对应列表:

public List<EquivalenceGroupsTO> read(String filename) throws IOException 
    return Files.lines(Paths.get(filename)) // Stream<String>
            .map(s -> s.split("\\|"))       // Stream<String[]>
             // make sure all data are available
            .filter(arr -> arr.length > 7)  // Stream<String[]>
            .map(arr -> 
                EquivalenceGroupsTO egTo = new EquivalenceGroupsTO();
                egTo.setEquivalenceGroupsCode(str[5]);
                egTo.setDescription(str[7]);
                egTo.setLastUpdateDate(new Date());
                return egTo;
            ) // Stream<EquivalenceGroupsTO>
            .collect(Collectors.toList())

【讨论】:

以上是关于在Java中拆分一个字符串并将其插入一个空字符串的主要内容,如果未能解决你的问题,请参考以下文章

根据正则表达式拆分字符串

如何拆分字符串并将其存储在临时变量中[重复]

拆分一个字符串并将其放入两个数组中

如何在 Ruby 中拆分分隔字符串并将其转换为数组?

拆分具有多个分隔符的字符串并将其保存到向量中

解释数据字符串并将其插入到 Java 中正确列位置的 JTable 中