Java 超级CSV将bean写入CSV

Java 超级CSV将bean写入CSV,java,csv,javabeans,supercsv,Java,Csv,Javabeans,Supercsv,这是我的班级 public class FreebasePeopleResults { public String intendedSearch; public String weight; public Double heightMeters; public Integer age; public String type; public String parents; public String profession; public String alias; public String c

这是我的班级

public class FreebasePeopleResults {

public String intendedSearch;
public String weight;
public Double heightMeters;
public Integer age;
public String type;
public String parents;
public String profession;
public String alias;
public String children;
public String siblings;
public String spouse;
public String degree;
public String institution;
public String wikipediaId;
public String guid;
public String id;
public String gender;
public String name;
public String ethnicity;
public String articleText;
public String dob;

public String getWeight() {
    return weight;
}
public void setWeight(String weight) {
    this.weight = weight;
}
public Double getHeightMeters() {
    return heightMeters;
}
public void setHeightMeters(Double heightMeters) {
    this.heightMeters = heightMeters;
}
public String getParents() {
    return parents;
}
public void setParents(String parents) {
    this.parents = parents;
}
public Integer getAge() {
    return age;
}
public void setAge(Integer age) {
    this.age = age;
}       
public String getProfession() {
    return profession;
}
public void setProfession(String profession) {
    this.profession = profession;
}
public String getAlias() {
    return alias;
}
public void setAlias(String alias) {
    this.alias = alias;
}
public String getChildren() {
    return children;
}
public void setChildren(String children) {
    this.children = children;
}
public String getSpouse() {
    return spouse;
}
public void setSpouse(String spouse) {
    this.spouse = spouse;
}
public String getDegree() {
    return degree;
}
public void setDegree(String degree) {
    this.degree = degree;
}
public String getInstitution() {
    return institution;
}
public void setInstitution(String institution) {
    this.institution = institution;
}
public String getWikipediaId() {
    return wikipediaId;
}
public void setWikipediaId(String wikipediaId) {
    this.wikipediaId = wikipediaId;
}
public String getGuid() {
    return guid;
}
public void setGuid(String guid) {
    this.guid = guid;
}
public String getId() {
    return id;
}
public void setId(String id) {
    this.id = id;
}
public String getGender() {
    return gender;
}
public void setGender(String gender) {
    this.gender = gender;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getEthnicity() {
    return ethnicity;
}
public void setEthnicity(String ethnicity) {
    this.ethnicity = ethnicity;
}
public String getArticleText() {
    return articleText;
}
public void setArticleText(String articleText) {
    this.articleText = articleText;
}
public String getDob() {
    return dob;
}
public void setDob(String dob) {
    this.dob = dob;
}
public String getType() {
    return type;
}
public void setType(String type) {
    this.type = type;
}
public String getSiblings() {
    return siblings;
}
public void setSiblings(String siblings) {
    this.siblings = siblings;
}
public String getIntendedSearch() {
    return intendedSearch;
}
public void setIntendedSearch(String intendedSearch) {
    this.intendedSearch = intendedSearch;
}
}

这是我的CSV编写器方法

 import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

import org.supercsv.io.CsvBeanWriter;
import org.supercsv.prefs.CsvPreference;

public class CSVUtils {

    public static void writeCSVFromList(ArrayList<FreebasePeopleResults> people, boolean writeHeader) throws IOException{

        //String[] header = new String []{"title","acronym","globalId","interfaceId","developer","description","publisher","genre","subGenre","platform","esrb","reviewScore","releaseDate","price","cheatArticleId"};
        FileWriter file = new FileWriter("/brian/brian/Documents/people-freebase.csv", true);

        // write the partial data
        CsvBeanWriter writer = new CsvBeanWriter(file, CsvPreference.EXCEL_PREFERENCE);

        for(FreebasePeopleResults person:people){
            writer.write(person);
        }
        writer.close();
        // show output
    }           
}
导入java.io.FileWriter;
导入java.io.IOException;
导入java.util.ArrayList;
导入org.supercsv.io.CsvBeanWriter;
导入org.supercsv.prefs.CsvPreference;
公共类CSVutil{
公共静态void writecsvromlist(ArrayList-people,boolean-writeHeader)引发IOException{
//String[]header=新字符串[]{“title”、“首字母缩写”、“globalId”、“interfaceId”、“developer”、“description”、“publisher”、“genre”、“subGenre”、“platform”、“esrb”、“reviewScore”、“releaseDate”、“price”、“cheatArticleId”};
FileWriter file=newfilewriter(“/brian/brian/Documents/people freebase.csv”,true);
//写入部分数据
CsvBeanWriter=新的CsvBeanWriter(文件,CsvPreference.EXCEL_首选项);
for(FreebasePeopleResults个人:人){
作者:写(人);
}
writer.close();
//显示输出
}           
}
我不断收到输出错误。以下是错误: 第2行上下文:第2行列:0原始行: 空的


现在,我知道它现在是完全空的,所以我很困惑

我看不到在哪里创建
arraylistpeople
,但您可以验证它是否有多个元素。作为例子,考虑使用<代码>列表人<代码>作为正式参数。 附录:你能做到这一点吗

示例:下面是一个简化的示例。我认为您只需要在调用
write()
时指定
nameMapping
。这些名称决定了get方法通过内省调用什么

控制台输出: name,age Alpha,1 Beta,2 Gamma,3 姓名、年龄 阿尔法,1 贝塔,2 伽马,3

import java.io.IOException;
导入java.io.PrintWriter;
导入java.util.ArrayList;
导入java.util.List;
导入org.supercsv.io.CsvBeanWriter;
导入org.supercsv.io.ICsvBeanWriter;
导入org.supercsv.prefs.CsvPreference;
公共班机{
private static final List people=new ArrayList();
公共静态void main(字符串[]args)引发IOException{
人员。添加(新人员(“Alpha”,1));
添加(新人物(“Beta”,2));
人员。添加(新人员(“Gamma”,3));
ICsvBeanWriter=新的CsvBeanWriter(
新的PrintWriter(System.out),CsvPreference.STANDARD_首选);
试一试{
最终字符串[]名称映射=新字符串[]{“名称”,“年龄”};
writer.writeHeader(名称映射);
用于(人员p:人员){
write.write(p,nameMapping);
}
}最后{
writer.close();
}
}
}
公共阶层人士{
字符串名;
整数年龄;
公众人物(字符串名称,整数年龄){
this.name=名称;
这个。年龄=年龄;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数期限){
这个。年龄=年龄;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}

我看不出您在哪里创建了
ArrayList people
,但您可以验证它是否有多个元素。作为例子,考虑使用<代码>列表人<代码>作为正式参数。 附录:你能做到这一点吗

示例:下面是一个简化的示例。我认为您只需要在调用
write()
时指定
nameMapping
。这些名称决定了get方法通过内省调用什么

控制台输出: name,age Alpha,1 Beta,2 Gamma,3 姓名、年龄 阿尔法,1 贝塔,2 伽马,3

import java.io.IOException;
导入java.io.PrintWriter;
导入java.util.ArrayList;
导入java.util.List;
导入org.supercsv.io.CsvBeanWriter;
导入org.supercsv.io.ICsvBeanWriter;
导入org.supercsv.prefs.CsvPreference;
公共班机{
private static final List people=new ArrayList();
公共静态void main(字符串[]args)引发IOException{
人员。添加(新人员(“Alpha”,1));
添加(新人物(“Beta”,2));
人员。添加(新人员(“Gamma”,3));
ICsvBeanWriter=新的CsvBeanWriter(
新的PrintWriter(System.out),CsvPreference.STANDARD_首选);
试一试{
最终字符串[]名称映射=新字符串[]{“名称”,“年龄”};
writer.writeHeader(名称映射);
用于(人员p:人员){
write.write(p,nameMapping);
}
}最后{
writer.close();
}
}
}
公共阶层人士{
字符串名;
整数年龄;
公众人物(字符串名称,整数年龄){
this.name=名称;
这个。年龄=年龄;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数期限){
这个。年龄=年龄;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}

所以已经有一段时间了,你可能已经从这一点开始了,但是

问题实际上是您没有向
write()
方法提供头,也就是说,它应该是

writer.write(person, header);
不幸的是,API在
write()
方法的签名中使用var args符号有点误导,因为它允许传入
null
。javadoc明确声明不应该这样做,但是在实现中没有空检查:因此您得到了异常

/**
 * Write an object
 * 
 * @param source
 *            at object (bean instance) whose values to extract
 * @param nameMapping
 *            defines the fields of the class that must be written. 
 *            null values are not allowed
 * @since 1.0
 */
public void write(Object source, String... nameMapping) throws IOException,
    SuperCSVReflectionException;
他现在出去了。它在
write()
方法中保留var args,但如果提供null,则会很快失败,因此您可以确切地知道在获得具有以下内容的NullPointerException时出现了什么问题:

nameMapping数组不能为null,因为它用于从字段映射到 纵队


它还包括许多错误修复和新功能(包括Maven支持和用于映射嵌套属性和数组/集合的新Dozer扩展)。

所以已经有一段时间了,您可能已经从这一点开始了,但是…

CellProcessor[] processors = new CellProcessor[] { new Optional(), new NotNull(), new Optional(), new Optional(), new NotNull(), new Optional()}; CsvBeanWriter writer = new CsvBeanWriter(file, CsvPreference.EXCEL_PREFERENCE) writer.write(data,properties,processors);