2010-05-10 35 views
1

这里是我的课,SUPER CSV写豆到CSV

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原始行: null

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

+0

SuperCSV。你可以在这里找到它。我是java的新手,并且为什么会出现这个错误,我有点困惑。 http://supercsv.sourceforge.net/ – ButtersB 2010-05-10 22:28:29

回答

3

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

的问题是实际上是你没有提供的头部为write()方法,也就是说,它应该是

writer.write(person, header); 

不幸的是,API是一个有点误导,在它的使用VAR-ARGS符号在signat write()方法,因为它允许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,但无法快,如果你提供一个空的,所以你知道,当你用下面的一个NullPointerException究竟出了什么问题:

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

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

2

我看不到您在哪里创建ArrayList<FreebasePeopleResults> people,但您可能会验证它有多个元素。作为coding to the interface的例子,考虑使用List<FreebasePeopleResults> people作为形式参数。

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

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

控制台输出:

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

所以你说使用List类型而不是ArrayList? – ButtersB 2010-05-10 23:13:02

+0

然后我用另一种方法创建ArrayList 人并将其传入。 我知道它有数据,因为如果我执行sysout(person.name),我将在控制台中看到它。 – ButtersB 2010-05-10 23:15:57

+0

@Butters:是的,'列表',但这是切题你的问题。第0列应该是什么字段? – trashgod 2010-05-10 23:26:46

2
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);