이것은 확실히 Super CSV로 달성 할 수 있습니다. nameMapping
배열에 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", 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
아마 가장 쉬운 해결책이다,하지만 당신은 더 유연 뭔가 후 있다면 (당신은 필드 값의 유효성을 검사하고자하지만, 쓰기 않을 수도 있습니다 예를 들어, 사용자 정의 셀 프로세서를 작성하여 필드가 작성되지 않도록 할 수 있습니다. 다음
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);
}
}
}
그래서 당신은 빈의 middleName
필드는 항상 가지고 있음을 확인하기 위해 함께 new NotNull(new Ignore())
그것을 체인 수 그냥 항상 빈 값을 무시 셀 프로세서를 정의 가치가 있지만 그것을 쓰지 마십시오. 나중에 마음이 바뀌어 값을 쓰고 싶다면 (또는 NotNull()
또는 원하는대로) 프로세서를 Ignore()
으로 바꿀 수 있으며 중간 이름 필드를 무시하는 대신 써야합니다. .
읽기 :이 자바에 대한 다른 CSV 구문 분석 라이브러리보다 훨씬 간단하고 빠른로
무엇을 어떻게 시도했는지 확실하지 않습니다. 그리고 opencsv와 supercsv가 어떻게 시도되는지. – RobAu
@RobAu 안녕하세요. 저는이 라이브러리를 사용하는 사람들이 조언을 해줄 수 있도록 opencsv 또는 supercsv를 사용하지 않았습니다. 이러한 태그를 추가했습니다. 나는 단지 jsefa를 시도했다. 내가 더 분명하게하려고 노력하겠습니다. – Ashish