我有Java课程:
class data {
private String id;
private String name;
private String phone;
}
我需要填写CSV文件中的数据。但并非CSV文件中的所有列都是必需的,或者可能的顺序不同。
CSV示例1:
id,电话,姓名
1,421904123456,彼得
2,420558811225,约翰
...
CSV示例2:
id,姓名
3,亚历克斯
8,Stefan
有任何建议如何做到这一点?
答案 0 :(得分:1)
使用OpenCSV来读取文件。当读取第一行存储列的顺序时。当阅读以下行(每行给出一个String[]
)时,使用第一行中的信息从数组中获取元素。
这是OpenCSV文档中的一个示例:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
// nextLine[] is an array of values from the line
System.out.println(nextLine[0] + nextLine[1] + "etc...");
}
答案 1 :(得分:1)
您可以查看Execute SQL on CSV files via JDBC以使用jdbc查询CSV。
此外,您的课程应该是Data
而不是data
。
答案 2 :(得分:0)
Super CSV是另一个用于Java的开源CSV API,支持开箱即用的此功能。请参阅partial reading上的示例。
它使用标题(即第一行)来确定要映射到bean的字段 - 这样就可以很好地读取两个文件。
如果您在bean中使用其他类型(日期,整数等)而不仅仅使用字符串,那么Super CSV可以使用cell processor API为您完成所有必需的转换/转换。
例如,以下代码会读取您的两个文件,但只会填充CSV文件中存在的字段。
ICsvBeanReader beanReader = null;
try {
beanReader = new CsvBeanReader(new FileReader(CSV_FILENAME),
CsvPreference.STANDARD_PREFERENCE);
// header is used to map CSV column -> field in bean
final String[] header = beanReader.getHeader(true);
Data data;
while( (data = beanReader.read(Data.class, header)) != null ) {
System.out.println(String.format("id=%s, name=%s, phone=%s",
data.getId(), data.getName(), data.getPhone()));
}
}
finally {
if( beanReader != null ) {
beanReader.close();
}
}