web-dev-qa-db-ja.com

CSV値をJAVAのHashMapキー値ペアに変換します

こんにちは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)

誰かがコードを修正してプログラムのエラーを見つけるのを手伝ってくれませんか?

11
Newbie

初めて分割したときの文字列には、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]);
        }
10
Rakesh KR

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;
}
12
Kechit Goyal

最初の数値がペアではなく、例外の原因となっている問題の他に、Hashmapは一意のキーを使用するため、Hashmapを使用したくないため、2行目は1行目の値を置き換えます。

この場合、MultiMapまたはペアのリストを使用する必要があります。

0
cri_sys
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

}
0
dimuthu93

呼び出しの出力を見てくださいString arr[] = str[i].split(":"); arr [1]はCSVファイルの最初の要素に存在しません。これはたまたま1、2です... int i = 0でループを開始して、この問題を修正します。

0
Marek Puchalski

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/ にあります

0
tom