解析csv String并映射到java对象

时间:2014-09-17 13:00:21

标签: java google-app-engine csv

我正在尝试解析像这样的csv字符串

    COL1,COL2,COL3
    1,2,3
    2,4,5

并将列映射到java对象 -

    Class Person{
       COL1,
       COL2,
       COL3;
     }

我在google上找到的大多数库都是针对csv文件的,但我正在使用谷歌应用引擎,因此无法写入或读取文件。目前我正在使用拆分方法,但这种方法的问题是

    我在csv字符串中获取的
  1. 列可能会有所不同

    COL1,COL3,COL2
    
  2. 不想使用拆分和获取每列的样板代码。所以我需要的是列标题列表,并使用标题映射器读取集合中的所有列。迭代时,将列值映射到java对象。

  3. 基于相似类型的要求有几个问题,但它们都没有帮助我。 如果有人这样做过,请你分享一下这个想法吗?谢谢!

3 个答案:

答案 0 :(得分:2)

在搜索并尝试了几个库后,我能够解决它。如果有人以后需要,我会分享代码 -

    public class CSVParsing {

      public void parseCSV() throws IOException {

      List<Person> list = Lists.newArrayList();

      String str = "COL1,COL2,COL3\n" +
                   "A,B,23\n" +
                   "S,H,20\n";

      CsvSchema schema = CsvSchema.emptySchema().withHeader();

      ObjectReader mapper = new CsvMapper().reader(Person.class).with(schema);

      MappingIterator<Person> it = mapper.readValues(str);
      while (it.hasNext()) {
          list.add(it.next());
      }

      System.out.println("stored list is:" + (list != null ? list.toString() : null));
  }}

答案 1 :(得分:0)

使用Tokenizer将字符串拆分为对象,然后将其设置为对象。

 //Split the string into tokens using a comma as the token seperator
 StringTokenizer st = new StringTokenizer(lineFromFile, ",");

 while (st.hasMoreTokens()) 
 {
     //Collect each item  
     st.nextElement();
 } 

 //Set to object
 Person p = new Person(item1, item2, item3);

如果可以反转列,则解析标题行,保存其值并使用它来决定每个令牌使用哪个列,例如Map

String columns[] = new String[3]; //Fill these with column names

Map<String,String> map = new HashMap<>();
int i=0;

while (st.hasMoreTokens()) 
{
    //Collect each item  
    map.put(columns[i++], st.nextElement());
}

然后,创建Person

 Person p = new Person(map.get("COL1"), map.get("COL2"), map.get("COL3"));

答案 2 :(得分:0)

  

我在google上找到的大多数库都是用于csv文件,但我是   使用谷歌应用引擎,因此无法写入或读取文件

您可以读取文件(在项目文件系统中)。 您可以在blobstore中读取和写入文件,谷歌云存储