2014-10-24 3 views
2

jsefa 라이브러리를 사용하여 예를 들어 csv를 선택적으로 deserialize합니다. 헤더 번호 만 매핑. 1,3,5 내 개체에,이 잘 작동합니다.CSV, Java에 대한 선택적 직렬화

이제 헤더의 위치 1,3,5에 개체를 선택적으로 직렬화하고 나머지 위치는 세미콜론 (;)으로 구분해야합니다.

Header1;Header2;Header3;Header4;Header5;Header6;Header7 
bla1;;bla3;;bla5 

아무도 제안 할 수 있습니다,이 jsefa 또는 다른 라이브러리와 함께 할 수있는 방법 : 그래서 출력은 다음과 같을 것이다.

+0

무엇을 어떻게 시도했는지 확실하지 않습니다. 그리고 opencsv와 supercsv가 어떻게 시도되는지. – RobAu

+0

@RobAu 안녕하세요. 저는이 라이브러리를 사용하는 사람들이 조언을 해줄 수 있도록 opencsv 또는 supercsv를 사용하지 않았습니다. 이러한 태그를 추가했습니다. 나는 단지 jsefa를 시도했다. 내가 더 분명하게하려고 노력하겠습니다. – Ashish

답변

0

이것은 확실히 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 구문 분석 라이브러리보다 훨씬 간단하고 빠른로

+1

이것은 확실히 작동하지만 jsefa로 어떻게 같은 결과를 얻을 수 있습니까? – Ashish

0

그냥 uniVocity-parsers를 사용

CsvParserSettings settings = new CsvParserSettings(); 
settings.selectIndexes(1, 3, 5); 

CsvParser parser = new CsvParser(settings); 
List<String[]> parsedRows = parser.parseAll(yourJavaIoReader); 

작성하려면

CsvWriterSettings settings = new CsvWriterSettings(); 
settings.selectIndexes(1, 3, 5); 

CsvWriter writer = new CsvWriter(outputWriter, settings); 
writer.writeAllRowsAndClose(buildMyListOfRowsWith3Elements()); 

공시 : 나는 이 도서관의 저자 야. 오픈 소스이며 무료입니다 (Apache V2.0 라이센스).

관련 문제