Получение ключа и значения relatedHashMap - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь прочитать данные из CSV-файла, сохранить их в connectedHashMap и распечатать их. Но дело в том, что мне нужно печатать ключ и значение отдельно. CSV-файл имеет только 2 столбца: первый: электронная почта, второй: имя.

public class CsvReader {

String CSVPath = "c:/Users/PC/Desktop/file.csv";
CSVReader reader;

public void readCsvFile() throws IOException {
    try {

        reader = new CSVReader(new FileReader(CSVPath));
        String[] column;
        ArrayList<LinkedHashMap<String, String>> myArraylist = new 
    ArrayList<LinkedHashMap<String, String>>();
        LinkedHashMap<String, String> map;

        while ((column = reader.readNext()) != null) {
            map = new LinkedHashMap<String, String>();
            map.put("Emails", column[0]);
            myArraylist.add(map);
        }
        reader.close();

        for (int i = 0; i < myArraylist.size(); i++) {

System.out.println(myArraylist.get(i).get("Emails").toString());

        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}


}

Когда я запускаю этот код, я получаю следующее:

info@staybysantacruz.com;Quality Inn & Suites Santa Cruz Mountains
VacationRentals321@gmail.com;In Big Bear
info@haiyi-hotels.com;Best Western Americania

, поэтому он печатает электронную почту и имя вместе. Я попытался добраться до ключа и значения связанных HashMap, но безуспешно. Может ли кто-нибудь помочь мне?

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Для файла csv лучше использовать Apache commons csv jar, так как он эффективен и предназначен для чтения CSV с минимальным кодом, а улучшенные функции ниже - это код для того же

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;

public class Test {

    static String CSVPath = "c:/Test/SampleFile.csv";

    public static void main(String...strings) throws IOException {
        Map<String, String> userNameEmailMap = new HashMap<String, String>();
        CSVParser csvParser = new CSVParser(new FileReader(new File(CSVPath)), CSVFormat.DEFAULT);
        List<CSVRecord> values = csvParser.getRecords();
        for (CSVRecord csvRecord : values) {
            for (String rowRecord : csvRecord) {
                String[] records = rowRecord.split("\\s+");
                System.out.println(Arrays.toString(records));
                //if you want to add it to a map 
                userNameEmailMap.put(records[0], records[1]);
            }
        }
        csvParser.close();

        for (Entry<String, String> entry : userNameEmailMap.entrySet()) {
            System.out.println("Email :: "+entry.getKey()+"   "+"Value :: "+entry.getValue());
        }
    }
}

Я использовал commons-csv 1.5 maven link https://mvnrepository.com/artifact/org.apache.commons/commons-csv/1.5

Лучше использовать commons csv, так как это поможет в расширении в будущем, если добавится дополнительный столбец.

0 голосов
/ 31 октября 2018

Как и в данных вашего CSV-файла, разделенных полуколоннами, в первую очередь вы должны предоставить разделитель CsvReader.

 reader = new CSVReader(new FileReader(CSVPath),";");

Это устаревшая конструкторская инициализация.

Для получения последней версии API вы можете использовать приведенный ниже код для получения CSVReader для объекта с разделителем.

 final CSVParser parser = new CSVParserBuilder()
  .withSeparator(';')
  .withIgnoreQuotations(true)
  .build();

final CSVReader reader = new CSVReaderBuilder(new StringReader(csv))
  .withSkipLines(1)
  .withCSVParser(parser)
  .build();

Предполагается, что у вас есть разделитель полуколон, если у вас есть любой другой разделитель, кроме запятой, потому что это разделитель по умолчанию для CSVReader

0 голосов
/ 31 октября 2018

Вы читаете это как CSV, но похоже, что разделены точкой с запятой

так раскол

String email = column[0].split (";")[0];
String desc = column[0].split (";")[1];
...