Converte dados do arquivo LDIF para CSV

0

É necessário converter atributos selecionados do bloco de texto entre linhas em branco no arquivo LDIF (texto) e convertê-lo em arquivo CSV com delimitador separado por vírgula, semelhante ao exemplo abaixo:

Exemplo:

Arquivo LDIF (como entrada):

<Blank Line>
AA: User11_Value1
BB: User11_Value2
CC: User11_Value3
DD: User11 Space Value4
<Blank Line>
AA: User22_Value1
BB: User22_Value2
CC: User22_Value3
DD: User22 Space Value4
<Blank Line>

Converta para o formato CSV (como saída):

AA,BB,DD
User11_Value1,User11_Value2,User11 Space Value4
User22_Value1,User22_Value2,User22 Space Value4
    
por Riz 18.07.2018 / 23:23

2 respostas

0

Este é o script que lê o LDIF de STDIN e a saída como CSV

#!/bin/bash

#

# Converts LDIF data to CSV.

# Doesn't handle comments very well. Use -LLL with ldapsearch to remove them.

#

# 2010-03-07

# [email protected]

#


# Show usage if we don't have the right params

if [ "$1" == "" ]; then

    echo ""

    echo "Usage: cat ldif.txt | $0 <attributes> [...]"

    echo "Where <attributes> contains a list of space-separated attributes to include in the CSV. LDIF data is read from stdin."

    echo ""

    exit 99

fi


ATTRS="$*"


c=0

while read line; do


    # Skip LDIF comments

    [ "${line:0:1}" == "#" ] && continue;


    # If this line is blank then it's the end of this record, and the beginning

    # of a new one.

    #

    if [ "$line" == "" ]; then


        output=""


        # Output the CSV record

        for i in $ATTRS; do


            eval data=\$RECORD_${c}_${i}

            output=${output}\"${data}\",


            unset RECORD_${c}_${i}


        done


        # Remove trailing ',' and echo the output

        output=${output%,}

        echo $output


        # Increase the counter

        c=$(($c+1))

    fi


    # Separate attribute name/value at the semicolon (LDIF format)

    attr=${line%%:*}

    value=${line#*: }


    # Save all the attributes in variables for now (ie. buffer), because the data

    # isn't necessarily in a set order.

    #

    for i in $ATTRS; do

        if [ "$attr" == "$i" ]; then

            eval RECORD_${c}_${attr}=\"$value\"

        fi

    done


done

Clique aqui para mais

    
por 19.07.2018 / 06:15
0

Eu vejo algumas deficiências sérias em scripts simples como este:

  • nenhum tratamento adequado de dados codificados em base64 que é usado para caracteres não-ASCII ou sequências de octetos
  • sem manuseio adequado da quebra de linha
  • O modelo de dados LDAP tem atributos com vários valores

Se você não quiser consertar isso depois de ler o RFC 2849 , eu recomendaria implementar um pequeno Script Python usando o sub-módulo python-ldap ldif e o csv / em> módulo.

    
por 20.07.2018 / 22:18

Tags