获取linkedHashMap的键和值

时间:2018-10-31 05:51:54

标签: java csv linked-list readfile linkedhashmap

我尝试从csv文件读取数据,将其保存到linkedHashMap并打印。但是问题是我没有分别打印键和值。 CSV文件只有两列:第一列:电子邮件,第二列:名称。

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

因此它可以同时打印电子邮件和姓名。 我试图获得linkedHashMap的键和值,但是没有运气。 有人可以帮我吗?

3 个答案:

答案 0 :(得分:1)

就像在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的默认分隔符

答案 1 :(得分:0)

您正在以CSV格式阅读此文件,但似乎用分号分隔了

所以分裂

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

答案 2 :(得分:0)

对于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链接https://mvnrepository.com/artifact/org.apache.commons/commons-csv/1.5

最好使用common csv,因为如果添加了额外的列,它将有助于将来的扩展。