gpt4 book ai didi

java - 使用 apache commons csv 按索引大小而不是 withFirstRecordAsHeader 读取 csv

转载 作者:行者123 更新时间:2023-12-02 06:23:07 35 4
gpt4 key购买 nike

我正在尝试从 csv 中读取数据,如下所示:

id_number,last_name,first_name
123,Gibs,Walter
321,John,Chris
,,,,,,,,,,,,,,,,,
id_number,business_name
234,Abc Computers
417,Chris Inc

逗号行代表空白行(在 Excel 中)

为了清楚起见,下面是 csv 文件在 Excel 中的样子: enter image description here

public class CsvFileParser {

public static void customerMethod() {
BufferedReader fileReader = null;
CSVParser csvParser = null;

try {
fileReader = new BufferedReader(new FileReader("C:\\Users\\prassuha\\JavaProjects\\gs-maven-master\\complete\\src\\main\\java\\hello\\customer.csv"));
csvParser = new CSVParser(fileReader,
CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());

List<Customer> customers = new ArrayList<Customer>();

Iterable<CSVRecord> csvRecords = csvParser.getRecords();

for (CSVRecord csvRecord : csvRecords) {
Customer customer = new Customer(
csvRecord.get("tracking_number"),
csvRecord.get("business_name"),
);

customers.add(customer);
}

for (Customer customer : customers) {
System.out.println(customer);
}

} catch (Exception e) {
System.out.println("Reading CSV Error!");
e.printStackTrace();
} finally {
try {
fileReader.close();
csvParser.close();
} catch (IOException e) {
System.out.println("Closing fileReader/csvParser Error!");
e.printStackTrace();
}
}
}

public static void personalMethod() {
BufferedReader fileReader = null;
CSVParser csvParser = null;

try {
fileReader = new BufferedReader(new FileReader("C:\\Users\\prassuha\\JavaProjects\\gs-maven-master\\complete\\src\\main\\java\\hello\\customer2.csv"));
csvParser = new CSVParser(fileReader,
CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());

List<Personal> personals = new ArrayList<Personal>();

Iterable<CSVRecord> csvRecords = csvParser.getRecords();

for (CSVRecord csvRecord : csvRecords) {
Personal personal = new Personal(
csvRecord.get("tracking_number"),
csvRecord.get("full_name"),
);
personals.add(personal);
}

for (Personal personal : personals) {
System.out.println(personal);
}

} catch (Exception e) {
System.out.println("Reading CSV Error!");
e.printStackTrace();
} finally {
try {
fileReader.close();
csvParser.close();
} catch (IOException e) {
System.out.println("Closing fileReader/csvParser Error!");
e.printStackTrace();
}
}
}

public static void main(String[] args) {
customerMethod();
personalMethod();

}
}

目前,我正在使用 withFirstRecordAsHeader() 但我想检查索引的大小,然后检查空行,然后再次检查索引的大小。我不确定这是否是正确的方法 - 如果有更好的方法来阅读本文,请分享。谢谢!

最佳答案

将整个文件加载到内存中,并将其拆分为“空白”行。然后分别解析每个部分。

下面的代码盲目地假设该文件有 2 个部分,第一个部分是人员,第二个部分是企业。您可能想检查这些假设。

CSVFormat csvFormat = CSVFormat.RFC4180
.withFirstRecordAsHeader()
.withIgnoreHeaderCase()
.withTrim();

String fileName = "C:\\Users\\prassuha\\JavaProjects\\gs-maven-master\\complete\\src\\main\\java\\hello\\customer.csv";
String input = new String(Files.readAllBytes(Paths.get(fileName)), StandardCharsets.UTF_8);
String[] sections = input.split("(?m)^[,\\s]*\\R");

List<Person> persons = new ArrayList<>();
try (CSVParser csvParser = new CSVParser(new StringReader(sections[0]), csvFormat)) {
for (CSVRecord csvRecord : csvParser) {
String id_number = csvRecord.get("id_number");
if (id_number.isEmpty())
break; // end of person part of CSV data
persons.add(new Person(
id_number,
csvRecord.get("last_name"),
csvRecord.get("first_name")));
}
}

List<Business> businesses = new ArrayList<>();
try (CSVParser csvParser = new CSVParser(new StringReader(sections[1]), csvFormat)) {
for (CSVRecord csvRecord : csvParser) {
String id_number = csvRecord.get("id_number");
if (id_number.isEmpty())
break; // end of business part of CSV data
businesses.add(new Business(
id_number,
csvRecord.get("business_name")));
}
}

关于java - 使用 apache commons csv 按索引大小而不是 withFirstRecordAsHeader 读取 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55816461/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com