【问题标题】:SUPER CSV write bean to CSVSUPER CSV 将 bean 写入 CSV
【发布时间】:2010-05-10 22:23:31
【问题描述】:

这是我的课,

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
    }           
}

我不断收到输出错误。这是错误: 第 2 行上下文没有内容可写:行:2 列:0 原始行: 空

现在,我知道它现在完全为空,所以我很困惑。

【问题讨论】:

  • 超级CSV。你可以在这里找到它。我是java新手,我对为什么会发生这个错误有点困惑。 supercsv.sourceforge.net

标签: java csv javabeans supercsv


【解决方案1】:

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

问题实际上是您没有将标头提供给 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;

Super CSV 2.0.0-beta-1 现已发布。它保留了 write() 方法中的 var-args,但如果您提供 null,则会快速失败,因此当您收到带有以下内容的 NullPointerException 时,您确切知道出了什么问题:

nameMapping 数组不能为空,因为它用于从字段映射到 列

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

【讨论】:

    【解决方案2】:

    我看不到您在哪里创建 ArrayList&lt;FreebasePeopleResults&gt; people,但您可能会验证它是否包含多个元素。以coding to the interface 为例,考虑使用List&lt;FreebasePeopleResults&gt; people 作为形参。

    附录:您是否能够让Code example: Write a file with a header 工作?

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

    控制台输出:

    姓名年龄 阿尔法,1 贝塔,2 伽玛,3
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.List;
    import org.supercsv.io.CsvBeanWriter;
    import org.supercsv.io.ICsvBeanWriter;
    import org.supercsv.prefs.CsvPreference;
    
    public class Main {
    
        private static final List<Person> people = new ArrayList<Person>();
    
        public static void main(String[] args) throws IOException {
            people.add(new Person("Alpha", 1));
            people.add(new Person("Beta", 2));
            people.add(new Person("Gamma", 3));
            ICsvBeanWriter writer = new CsvBeanWriter(
                new PrintWriter(System.out), CsvPreference.STANDARD_PREFERENCE);
            try {
                final String[] nameMapping = new String[]{"name", "age"};
                writer.writeHeader(nameMapping);
                for (Person p : people) {
                    writer.write(p, nameMapping);
                }
            } finally {
                writer.close();
            }
        }
    }
    
    public class Person {
    
        String name;
        Integer age;
    
        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    【讨论】:

    • 所以你是说使用 List 类型而不是 ArrayList?
    • 然后我用另一种方法创建 ArrayList 人并将其传入。我知道它有数据,因为如果我执行 sysout (person.name),我会在控制台中看到它。
    • @Butters:是的,List&lt;type&gt;,但这与您的问题无关。第 0 列应该是什么字段?
    • 我一定是错误地实现了这个方法,因为我认为它会拉取类中的第一个字段并编写它,然后继续。
    【解决方案3】:
    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2012-08-06
      • 2018-12-17
      • 2013-01-21
      • 2017-04-15
      • 2017-12-03
      • 2016-10-26
      相关资源
      最近更新 更多