我尝试从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的键和值,但是没有运气。 有人可以帮我吗?
答案 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,因为如果添加了额外的列,它将有助于将来的扩展。