Você pode recomendar uma biblioteca Java para leitura (e possivelmente escrever) arquivos CSV? [fechadas]

StackOverflow https://stackoverflow.com/questions/200609

  •  03-07-2019
  •  | 
  •  

Pergunta

Você pode recomendar uma biblioteca Java para ler, analisar, validar e linhas de mapeamento em uma vírgula separados arquivo de valores (CSV) para objetos de valor Java (JavaBeans)?

Foi útil?

Solução

Temos usado http://opencsv.sourceforge.net/ com bom sucesso

Eu também me deparei com outra pergunta, com boas ligações: Java lib ou aplicativo para CSV converter para arquivo XML?

Outras dicas

Super CSV é uma ótima escolha para a leitura / análise, validação e arquivos de mapeamento CSV para POJOs!

Nós (a equipe Super CSV) acabaram de lançar uma nova versão (você pode download -lo do SourceForge ou Maven).

Lendo um arquivo CSV

O CsvDozerBeanReader seguinte exemplo usa (um novo leitor que já acabou de lançar que usos Dozer para mapeamento de feijão com mapeamento de profundidade e suporte de mapeamento baseado em índice) - é baseado no exemplo do nosso website . Se você não precisar da funcionalidade Dozer (ou você quer apenas uma dependência autônoma simples), então você pode usar CsvBeanReader vez (ver este código de exemplo ).

Exemplo de arquivo CSV

Aqui está um arquivo CSV exemplo que representa respostas a uma pesquisa. Ele tem um cabeçalho e 3 linhas de dados, todos com 8 colunas.

age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3
18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory
,Y,1,Thirteen,2,Nikola Tesla,3,Stargate
42,N,1,,2,Carl Sagan,3,Star Wars

Definir o mapeamento a partir de CSV para POJO

Cada linha da CSV será lido em um SurveyResponse classe , cada um dos quais tem uma lista de resposta s. Para que o mapeamento para o trabalho, suas classes deve ser Javabeans válidos (isto é, têm um padrão não-arg construtor e tem getters / setters definidos para cada campo).

Em Super CSV você definir o mapeamento com uma matriz String simples - cada elemento dos corresponde matriz a uma coluna no arquivo CSV

.

Com CsvDozerBeanMapper você pode usar:

  • simples mapeamentos de campo (por exemplo firstName)

  • mapeamentos profundas (por exemplo address.country.code)

  • mapeamento indexada (por exemplo middleNames[1] - baseado em zero índice de matrizes ou Colecções)

  • profunda + mapeamento indexada (por exemplo person.middleNames[1])

O seguinte é o mapeamento de campo para este exemplo - ele usa uma combinação destes:

private static final String[] FIELD_MAPPING = new String[] { 
        "age",                   // simple field mapping (like for CsvBeanReader)
        "consentGiven",          // as above
        "answers[0].questionNo", // indexed (first element) + deep mapping
        "answers[0].answer", 
        "answers[1].questionNo", // indexed (second element) + deep mapping
        "answers[1].answer", 
        "answers[2].questionNo", 
        "answers[2].answer" };

Conversão e Validação

Super CSV tem uma biblioteca útil de processadores celulares , que pode ser usado para converter as cordas a partir do arquivo CSV para outros tipos de dados (por exemplo, data, Integer), ou para fazer a validação de restrição (por exemplo obrigatória / opcional, correspondência regex, verificação de intervalo).

Usando processadores celulares é totalmente opcional -. Sem eles cada coluna da CSV será um String, de modo que cada campo deve ser uma String também

O que se segue é a configuração do processador de célula para o exemplo. Tal como acontece com o mapeamento de campo, cada elemento da matriz representa um coluna CSV. Ele demonstra como processadores celulares podem transformar os dados CSV para o tipo de dados de seu campo, e como eles podem ser encadeados.

final CellProcessor[] processors = new CellProcessor[] { 
    new Optional(new ParseInt()), // age
    new ParseBool(),              // consent
    new ParseInt(),               // questionNo 1
    new Optional(),               // answer 1
    new ParseInt(),               // questionNo 2
    new Optional(),               // answer 2
    new ParseInt(),               // questionNo 3
    new Optional()                // answer 3
};

Leitura

Reading com Super CSV é muito flexível: você fornecer seu próprio Reader (assim você pode ler a partir de um arquivo, o classpath, um arquivo zip, etc), e o delimitador e caracter de aspas são configuráveis ??através de preferências (das quais há uma série de configurações pré-definida que servem para a maioria dos usos)

O código abaixo é bastante auto-explicativo.

  1. Criar o leitor (com o seu Reader e preferências)

  2. (Opcionalmente) ler o cabeçalho

  3. Configurar o mapeamento de feijão

  4. Mantenha chamando read() até obter uma null (fim de arquivo)

  5. Fechar o reader

Código:

ICsvDozerBeanReader beanReader = null;
try {
    beanReader = new CsvDozerBeanReader(new FileReader(CSV_FILENAME),
        CsvPreference.STANDARD_PREFERENCE);

    beanReader.getHeader(true); // ignore the header
    beanReader.configureBeanMapping(SurveyResponse.class, FIELD_MAPPING);

    SurveyResponse surveyResponse;
    while( (surveyResponse = 
        beanReader.read(SurveyResponse.class, processors)) != null ) {
        System.out.println(
            String.format("lineNo=%s, rowNo=%s, surveyResponse=%s",
                beanReader.getLineNumber(), beanReader.getRowNumber(), 
                surveyResponse));
    }

} finally {
    if( beanReader != null ) {
        beanReader.close();
    }
}

Output:

lineNo=2, rowNo=2, surveyResponse=SurveyResponse [age=18, consentGiven=true, answers=[Answer [questionNo=1, answer=Twelve], Answer [questionNo=2, answer=Albert Einstein], Answer [questionNo=3, answer=Big Bang Theory]]]
lineNo=3, rowNo=3, surveyResponse=SurveyResponse [age=null, consentGiven=true, answers=[Answer [questionNo=1, answer=Thirteen], Answer [questionNo=2, answer=Nikola Tesla], Answer [questionNo=3, answer=Stargate]]]
lineNo=4, rowNo=4, surveyResponse=SurveyResponse [age=42, consentGiven=false, answers=[Answer [questionNo=1, answer=null], Answer [questionNo=2, answer=Carl Sagan], Answer [questionNo=3, answer=Star Wars]]]

Mais informações

Você pode encontrar muito mais informações sobre o website !

Posso recomendar SuperCSV . Simples de usar, e fez tudo que eu precisava.

Ei, eu tenho um projeto de código aberto para que: JFileHelpers . Eu acho que a principal vantagem é que ele usa Java Anotações, dê uma olhada:

Se você tem esse bean:

@FixedLengthRecord()
public class Customer {
    @FieldFixedLength(4)
    public Integer custId;

    @FieldAlign(alignMode=AlignMode.Right)
    @FieldFixedLength(20)
    public String name;

    @FieldFixedLength(3)
    public Integer rating;

    @FieldTrim(trimMode=TrimMode.Right)
    @FieldFixedLength(10)
    @FieldConverter(converter = ConverterKind.Date, 
    format = "dd-MM-yyyy")
    public Date addedDate;

    @FieldFixedLength(3)
    @FieldOptional
    public String stockSimbol;    
}

E quer analisar este arquivo:

....|....1....|....2....|....3....|....4                
1   Antonio Pereira     10012-12-1978ABC
2   Felipe Coury          201-01-2007
3   Anderson Polga       4212-11-2007DEF      

Tudo que você tem a fazer é esta:

FileHelperEngine<Customer> engine = 
    new FileHelperEngine<Customer>(Customer.class); 
List<Customer> customers = 
    new ArrayList<Customer>();

customers = engine.readResource(
    "/samples/customers-fixed.txt");

Além disso, ele suporta mestre-detalhe, data e formato de conversão, e muito mais. Deixe-me saber o que você pensa!

Com os melhores cumprimentos!

Flatpack para ser realmente bom com a manipulação de arquivos CSV peculiar (fugas, citações, registros ruins, etc.)

O arquivo CSV à pergunta XML pediu anteriormente parece responder todas as minhas perguntas.

OpenCSV ( http://opencsv.sourceforge.net/ ) também faz ligação a JavaBeans usando um coluna Posição estratégia de mapeamento

  ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
  strat.setType(YourOrderBean.class);
  String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
  strat.setColumnMapping(columns);

  CsvToBean csv = new CsvToBean();
  List list = csv.parse(strat, yourReader);

JSEFA ( http://jsefa.sourceforge.net ) também parece estar a fazer tudo o que preciso - particularmente ligação a objetos Java - além de apoiar FLR e XML

Eu tive um bom sucesso tanto de análise e gravação de arquivos CSV de Java com OpenCSV . Se você quiser ler ou escrever Excel planilha compatível com Java, o POI biblioteca de Apache é o caminho a percorrer .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top