Question

Here is my class,

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

}

Here is my CSV writer method

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

I keep getting output errors. Here is the error: There is no content to write for line 2 context: Line: 2 Column: 0 Raw line: null

Now, I know it is now totally null, so I am confused.

Was it helpful?

Solution

So it's been a while, and you've probably moved on from this, but...

The issue was actually that you weren't supplying the header to the write() method, i.e. it should be

writer.write(person, header);

Unfortunately the API is a little misleading in it's use of the var-args notation in the signature of the write() method, as it allows null to be passed in. The javadoc clearly states that you shouldn't do this, but there was no null-check in the implementation: hence the exception you were getting.

/**
 * 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 is out now. It retains the var-args in the write() method, but fails fast if you provide a null, so you know exactly what's wrong when you get a NullPointerException with the following:

the nameMapping array can't be null as it's used to map from fields to columns

It also includes many bug fixes and new features (including Maven support and a new Dozer extension for mapping nested properties and arrays/Collections).

OTHER TIPS

I don't see where you create ArrayList<FreebasePeopleResults> people, but you might verify that it has more than one element. As an example of coding to the interface, consider using List<FreebasePeopleResults> people as the formal parameter.

Addendum: Have you been able to make this Code example: Write a file with a header work?

Example: Here's a simplified example. I think you just need to specify the nameMapping when you invoke write(). Those names determine what get methods to call via introspection.

Console output:

name,age
Alpha,1
Beta,2
Gamma,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;
    }
}
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);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top