2013-11-19 8 views
4

HI У меня есть csv, называемый test.csv. Я пытаюсь прочитать csv по строке и преобразовать значения в пары значений хэш-ключа. Вот код: -Преобразование значений CSV в пары значений ключа HashMap в JAVA

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) 

Может кто-нибудь пожалуйста Помогите мне исправить код и узнать об ошибке в моей программе?

ответ

6

в строке, когда вы разбить его на первый раз только содержит 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]); 
     } 
-1

используя 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(); 
     } 
    } 
} 

банку доступен here

+0

Как получить значения в Hash? – Newbie

+0

просто редактирование, мин. Пожалуйста –

1

Проблема заключается в том, что когда вы split ваш str, первый элемент в каждой линии отдельно (т.е. 1 и 2). Таким образом, arr содержит только ["1"], и, следовательно, arr[1] не существует.

Т.е. для примера ввода:

1,"testCaseName":"ACLTest" 

разбивка по , =>str содержит {1, testCaseName:ACLTest}
разбивка по : при первой итерации => обр содержит {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<str.length;i++){ 
     String arr[] = str[i].split(":"); 
     map.put(arr[0], arr[1]); 
} 


Другая проблема заключается в том, что в HashMap использования hashCode ключей для хранения пар (ключ, значение).

Так что, когда insering "testCaseName":"ACLTest" и "testCaseName":"DCLAddTest", то первое значение будет стерто и заменить второй:

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

Выход:

{testCaseName=DCLAddTest} 

Таким образом, вы должны исправить это.

0

Посмотрите на выходе вызова String arr[] = str[i].split(":"); обр [1] не существует для первого элемента в файле CSV, который случается 1, 2 ... Вы можете запустить цикл с INT I = 0 в исправить эту проблему.

0

String.split - это мусор для анализа CSV. Используйте либо разделитель Guava, либо собственный анализатор CSV. Вы можете разобрать CSV в бобах с помощью картографа Джексон CSV так:

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/

0

Помимо проблемы вы имеете с первым номером, который его не пара и его вызывает исключение, вы не хочет использовать Hashmap, так как hashmap использует уникальный ключ, поэтому строка 2 заменит значения из строки 1.

В этом случае вы должны использовать MultiMap или список пар.

5

Использование пакета CSV FasterXML в: 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; 
} 
+0

Я думаю, что это лучшее решение для OpenCSV – mmansoor

0
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 

} 
Смежные вопросы