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)の1つを取得するために削除し、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スクリプトを実装することをお勧めします。目次そして組み込みデータセット基準寸法。

関連情報