![](/img/trans.png)
[英]Java split string on empty delimiter returns empty string at the beginning?
[英]Split a string in Java and insert it into an empty string
我有一個包含以下數據的 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)
我究竟做錯了什么?
評論中提到了主要問題:當拆分時|
字符,它必須轉義為\\\\|
因為管道字符在常規表達式中是用戶作為 OR 運算符。
下一個問題是將僅包含\\n
的行添加到file
。 當這條線被拆str[5]
, 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())
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.