Это, безусловно, достижимо с Super CSV. Просто укажите запись null
в массиве nameMapping
, чтобы всегда записывать пустой столбец.
private static void writePartial() throws IOException {
Person person1 = new Person("John", "K", "Smith");
Person person2 = new Person("Sally", "T", "Brown");
CsvPreference csvPrefs = new CsvPreference.Builder('"', ';', "\n").build();
String[] nameMapping = new String[] { "firstName", null, "lastName" };
try (ICsvBeanWriter writer = new CsvBeanWriter(new FileWriter("output.csv"), csvPrefs)) {
writer.writeHeader("firstName", "middleName", "lastName");
for( Person p : Arrays.asList(person1, person2) ) {
writer.write(p, nameMapping);
}
}
}
Вы должны получить следующий результат:
firstName;middleName;lastName
John;;Smith
Sally;;Brown
Это, вероятно, самое простое решение, но если вам нужно что-то более гибкое (например, вы можете проверить значение поля, но никогда не записывать его), вы можете создать собственный обработчик ячеек, чтобы гарантировать, что поле никогда не будет записано. Просто определите обработчик ячейки, который всегда игнорирует значение в bean-компоненте:
public class Ignore extends CellProcessorAdaptor {
@Override
public Object execute(Object value, CsvContext context) {
return null;
}
}
А затем используйте его:
private static void writePartial() throws IOException {
Person person1 = new Person("John", "K", "Smith");
Person person2 = new Person("Sally", "T", "Brown");
CsvPreference csvPrefs = new CsvPreference.Builder('"', ';', "\n").build();
String[] nameMapping = new String[] { "firstName", "middleName", "lastName" };
CellProcessor[] processors = new CellProcessor[] { new Optional(), new Ignore(), new Optional() };
try (ICsvBeanWriter writer = new CsvBeanWriter(new FileWriter("output.csv"), csvPrefs)) {
writer.writeHeader(nameMapping);
for( Person p : Arrays.asList(person1, person2) ) {
writer.write(p, nameMapping, processors);
}
}
}
Таким образом, вы можете связать их вместе new NotNull(new Ignore())
, чтобы проверить, что поле middleName
компонента всегда имеет значение, но никогда не записывать его. Это также означает, что если вы позже передумаете и захотите записать значение, вы можете заменить процессор Ignore()
на Optional()
(или NotNull()
, или что угодно) и увидеть, что он должен затем записать поле отчества, вместо того, чтобы игнорировать его. .
person
James Bassett
schedule
25.10.2014