将CSV值转换为JAVA中的HashMap键值对

我有一个名为test.csv的csv。 我试图逐行读取csv并将值转换为哈希键值对。 这是代码: –

 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 map = new HashMap(); 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) 

任何人都可以帮我修复代码并找出我的程序中的错误?

在你的String中,当你第一次拆分时只在arr[1]包含arr[0]1 ,所以它会导致exception

如果您不需要1,2等。您可以查看以下代码:

  String str[] = line.split(","); for(int i=1;i 

使用FasterXML的CSV包: https : //github.com/FasterXML/jackson-dataformats-text/tree/master/csv

 public static List> read(File file) throws JsonProcessingException, IOException { List> response = new LinkedList>(); CsvMapper mapper = new CsvMapper(); CsvSchema schema = CsvSchema.emptySchema().withHeader(); MappingIterator> iterator = mapper.reader(Map.class) .with(schema) .readValues(file); while (iterator.hasNext()) { response.add(iterator.next()); } return response; } 

问题是当你split str ,每行中的第一个元素是单独的(即1和2)。 所以arr只包含["1"] ,因此arr[1]不存在。

即示例输入:

 1,"testCaseName":"ACLTest" 

split by , => str包含{1, testCaseName:ACLTest}
拆分:在第一次迭代时=> arr包含{1}

示例:

 String s = "1,testCaseName:ACLTest"; String str[] = s.split(","); System.out.println(Arrays.toString(str)); for(String p : str){ String arr[] = p.split(":"); System.out.println(Arrays.toString(arr)); } 

输出:

 [1, testCaseName:ACLTest] [1] //<- here arr[1] doesn't exists, you only have arr[0] and hence the ArrayIndexOutOfBoundsException when trying to access arr[1] [testCaseName, ACLTest] 

要修复代码(如果您不想使用CSV解析器),请从1开始循环:

 for(int i=1;i 

另一个问题是HashMap使用键的hashCode来存储(键,值)对。

所以当进入"testCaseName":"ACLTest""testCaseName":"DCLAddTest" ,第一个值将被删除并被第二个值替换:

 Map map = new HashMap<>(); map.put("testCaseName","ACLTest"); map.put("testCaseName","DCLAddTest"); System.out.println(map); 

输出:

 {testCaseName=DCLAddTest} 

所以你必须解决这个问题。

查看调用String arr[] = str[i].split(":");的调用的输出String arr[] = str[i].split(":"); 对于CSV文件中的第一个元素,arr [1]不存在,恰好是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 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/

除了第一个数字的问题,它不是一对,它导致exception,你不会想使用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 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 } 

使用openCSV将是一种方法

 import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import au.com.bytecode.opencsv.CSVReader; public class CsvFileReader { public static void main(String[] args) { try { System.out.println("\n**** readLineByLineExample ****"); String csvFilename = "C:/Users/hussain.a/Desktop/sample.csv"; CSVReader csvReader = new CSVReader(new FileReader(csvFilename)); String[] col = null; while ((col = csvReader.readNext()) != null) { System.out.println(col[0] ); //System.out.println(col[0]); } csvReader.close(); } catch(ArrayIndexOutOfBoundsException ae) { System.out.println(ae+" : error here"); }catch (FileNotFoundException e) { System.out.println("asd"); e.printStackTrace(); } catch (IOException e) { System.out.println(""); e.printStackTrace(); } } } 

jar子可以在这里找到