LDIF 파일의 데이터를 CSV로 변환

LDIF 파일의 데이터를 CSV로 변환

다음 예와 유사하게 LDIF(텍스트) 파일의 빈 줄 사이에 있는 텍스트 블록에서 선택한 속성을 쉼표로 구분된 구분 기호가 있는 CSV 파일로 변환해야 합니다.

예:

LDIF 파일(입력):

<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>

CSV 형식으로 변환합니다(출력).

AA,BB,DD
User11_Value1,User11_Value2,User11 Space Value4
User22_Value1,User22_Value2,User22 Space Value4

답변1


밀러(http://johnkerl.org/miller/doc) sed는 매우 짧고 간단합니다.

sed 's/://g' input.txt | mlr --x2c cut -x -f CC

당신을 위한

AA,BB,DD
User11_Value1,User11_Value2,User11 Space Value4
User22_Value1,User22_Value2,User22 Space Value4

Whit sed :기본 밀러 입력 형식(XTAB) 중 하나를 얻기 위해 삭제한 다음 XTAB를 CSV로 변환하고 --x2c마지막으로 CCcut을 사용하여 필드를 삭제했습니다.

답변2

STDIN에서 LDIF를 읽어서 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

여기를 클릭하세요더 알아보기

답변3

나는 다음과 같이 간단한 스크립트에서 몇 가지 심각한 결함을 발견했습니다.

  • ASCII가 아닌 문자 또는 옥텟 문자열에 대한 Base64 인코딩 데이터가 제대로 처리되지 않습니다.
  • 줄바꿈이 올바르게 처리되지 않습니다.
  • LDAP 데이터 모델에는다중값속성

이 글을 읽은 후에도 이 문제를 스스로 해결하고 싶지 않다면RFC 2849python-ldap 하위 모듈을 사용하여 짧은 Python 스크립트를 구현하는 것이 좋습니다.목차그리고 내장데이터 세트기준 치수.

관련 정보