使用JSEFA将不同类的java对象序列化为CSV中的单行

时间:2014-02-03 08:54:10

标签: java csv serialization

我正在使用JSEFA使用JSEFA将我的java对象序列化为CSV格式的单行。 我在一个班级中有46个字段,

但现在问题是我想将这个类拆分为包含信息的不同子类,一个类包含前两个位置的CSV字段,下一个类包含剩余位置。当我尝试接近Prefix时,它将数据插入两个不同的行,但我需要将两个类的所有数据合并为一行 有些机构可以建议使用JSEFA或其他任何方式的最佳方法。

第一类包含前两个字段:

@CsvDataType(defaultPrefix = "1")

public class TestClass1 implements Serializable {

private static final long serialVersionUID = 371968159365574089L;

@CsvField(pos = 1)
private int id;

@CsvField(pos = 2)
private String Name;

public int getId() {
    return this.id;
}

public void setId(final int id) {
    this.id = id;
}

public String getName() {
    return this.Name;
}

public void setName(final String name) {
    this.Name = name;
}
  }

子类2,其中包含剩余的两个字段:

@CsvDataType(defaultPrefix = "2")
 public class TestClass2 implements Serializable {

private static final long serialVersionUID = 371968159365574089L;

@CsvField(pos = 3)
private int orderno;

@CsvField(pos = 4)
private String orderName;

public int getOrderno() {
    return this.orderno;
}

public void setOrderno(final int orderno) {
    this.orderno = orderno;
}


public String getOrderName() {
    return orderName;
}


public void setOrderName(String orderName) {
    this.orderName = orderName;
}


  }

组合的主要方法:

 public static void main(final String[] args) {

final File file = new File("/home/chandra/Documents/dataExcelFiles/final.csv");
    file.getParentFile().mkdirs();
 Serializer serializer = CsvIOFactory.createFactory(TestClass.class,  TestClass2.class).createSerializer();

    TestClass prod1 = new TestClass();

    prod1.setId(1);
    prod1.setName("HTC");

    TestClass2 prod2 = new TestClass2();
    prod2.setOrderno(512);
    prod2.setOrderName("HTC500");

    try {

        serializer.open(new FileWriter(file));
        serializer.write(prod1);
        serializer.write(prod2);
        serializer.close(true);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

使用这种方法就是这样:

  • 1 1 HTC
  • 2 512 HTC500

但我需要把所有东西放在一行中,如下所示:

  • 1 HTC 512 HTC500

谢谢, 钱德拉

1 个答案:

答案 0 :(得分:1)

serializer.write方法会写一条记录。由于你使用了两次(jsefa类的不同参数),它会写2条记录

你需要的是这样的东西:

子类1:

@Embeddable
@CsvDataType
public class TestClass1 implements Serializable {

private static final long serialVersionUID = 371968159365574089L;

@CsvField(pos = 1)
private int id;

@CsvField(pos = 2)
private String Name;

// getter setter methods
}

子类2:

@Embeddable
@CsvDataType
public class TestClass2 implements Serializable {

private static final long serialVersionUID = 371968159365574089L;

@CsvField(pos = 3)
private int orderno;

@CsvField(pos = 4)
private String orderName;

// getter setter methods
}

父类:

@CsvDataType()
public class TestClass {
    @CsvField ( pos = 1)
    private TestClass1 testClass1;
    @CsvField ( pos = 2)
    private TestClass2 testClass2;

    // getter setter methods
}

您的主要方法:

public static void main(final String[] args) {

final File file = new File("/home/chandra/Documents/dataExcelFiles/final.csv");
    file.getParentFile().mkdirs();
 Serializer serializer = CsvIOFactory.createFactory(TestClass.class,  TestClass2.class).createSerializer();

    TestClass testClass = new TestClass();

    testClass.getTestClass1().setId(1);
    testClass.getTestClass1().setName("HTC");
    testClass.getTestClass2().setOrderno(512);
    testClass.getTestClass2().setOrderName("HTC500");

    try {

        serializer.open(new FileWriter(file));
        serializer.write(testClass);
        serializer.close(true);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

如果要使用默认前缀,可以在TestClass中将DefaultPrefix添加为“1”,并从TestClass1中删除“id”。这意味着,所有记录都将以“1”

开头