在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.setEquivalenceGroupsCode 和 equivalenceGroupsTO.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"\\|"
上拆分并在循环中添加到 List
然后返回它
【参考方案1】:
cmets 中提到了主要问题:当使用|
字符分割时,必须将其转义为\\|
,因为管道字符在常规表达式中是用户作为 OR 运算符。
下一个问题是将仅包含\n
的行添加到file
。拆分此行时,str[5]
将失败并显示ArrayIndexOutOfBoundsException
。
其他小问题是未使用的变量count
和hset
。
但是,最好重构现有代码,使用 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中拆分一个字符串并将其插入一个空字符串的主要内容,如果未能解决你的问题,请参考以下文章