こんにちはtest.csv
というcsvがあります。私はcsvを1行ずつ読み取り、値をハッシュキー値のペアに変換しようとしています。これがコードです:-
public class Example {
public static void main(String[] args) throws ParseException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new FileReader("test.csv"));
String line = null;
HashMap<String,String> map = new HashMap<String, String>();
while((line=br.readLine())!=null){
String str[] = line.split(",");
for(int i=0;i<str.length;i++){
String arr[] = str[i].split(":");
map.put(arr[0], arr[1]);
}
}
System.out.println(map);
}
}
Csvファイルは次のとおりです。
1,"testCaseName":"ACLTest","group":"All_Int","projectType":"GEN","vtName":"NEW_VT","status":"ACTIVE","canOrder":"Yes","expectedResult":"duplicateacltrue"
2,"testCaseName":"DCLAddTest","group":"India_Int","projectType":"GEN_NEW","vtName":"OLD_VT","status":"ACTIVE","canOrder":"Yes","expectedResult":"invalidfeaturesacltrue"
このコードを実行すると、このエラーが発生します:-
Exception in thread "main" Java.lang.ArrayIndexOutOfBoundsException: 1
Example.main(Example.Java:33)
誰かがコードを修正してプログラムのエラーを見つけるのを手伝ってくれませんか?
初めて分割したときの文字列には、arr[0]
として1
のみが含まれているため、arr[1]
には何も含まれていないため、例外が発生します。
1、2などが必要ない場合は、次のコードを見てください。
String str[] = line.split(",");
for(int i=1;i<str.length;i++){
String arr[] = str[i].split(":");
map.put(arr[0], arr[1]);
}
FasterXMLのCSVパッケージの使用: https://github.com/FasterXML/jackson-dataformats-text/tree/master/csv
public static List<Map<String, String>> read(File file) throws JsonProcessingException, IOException {
List<Map<String, String>> response = new LinkedList<Map<String, String>>();
CsvMapper mapper = new CsvMapper();
CsvSchema schema = CsvSchema.emptySchema().withHeader();
MappingIterator<Map<String, String>> iterator = mapper.reader(Map.class)
.with(schema)
.readValues(file);
while (iterator.hasNext()) {
response.add(iterator.next());
}
return response;
}
最初の数値がペアではなく、例外の原因となっている問題の他に、Hashmapは一意のキーを使用するため、Hashmapを使用したくないため、2行目は1行目の値を置き換えます。
この場合、MultiMapまたはペアのリストを使用する必要があります。
import Java.io.BufferedReader;
import Java.io.FileReader;
import Java.io.IOException;
import Java.util.*;
public class Example {
public static void main(String[] args) {
String csvFile = "test.csv";
String line = "";
String cvsSplitBy = ",";
HashMap<String, String> list = new HashMap<>();
try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
while ((line = br.readLine()) != null) {
// use comma as separator
String[] country = line.split(cvsSplitBy);
//System.out.println(country[0] +" " + country[1]);
list.put(country[0], country[1]);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(list);
}
// enter code here
}
呼び出しの出力を見てくださいString arr[] = str[i].split(":");
arr [1]はCSVファイルの最初の要素に存在しません。これはたまたま1、2です... int i = 0でループを開始して、この問題を修正します。
String.splitはCSVを解析するためのゴミです。 Guava Splitterまたは適切なCSVパーサーを使用します。次のように、Jackson CSVマッパーを使用してCSVをBeanに解析できます。
public class CSVPerson{
public String firstname;
public String lastname;
//etc
}
CsvMapper mapper = new CsvMapper();
CsvSchema schema = CsvSchema.emptySchema().withHeader().withColumnSeparator(delimiter);
MappingIterator<CSVPerson> it = = mapper.reader(CSVPerson).with(schema).readValues(input);
while (it.hasNext()){
CSVPerson row = it.next();
}
詳細は http://demeranville.com/how-not-to-parse-csv-using-Java/ にあります