下記のような LDAP の ldif ファイル(似たファイルならなんでも)を dn, objectClass, uid,... のような csv ファイルに変換するプログラムです。ただ100行未満のプログラムですが、スキーマ(下記はinetOrgPersonというデフォルトのスキーマ)の情報がなくてもアカウントの一覧が作れます。いちいちテキストからExcelにコピペすると百数十件でも死ぬほど時間かかりますね。試していないが、数万件でも軽々変換してくれるだろう〜(^^)
LDAP以外のテキストは、35行目の my $patten = "^$header:(.*)"; を弄ってみてください〜。
dn: uid=S0205,ou=mailsys,dc=syokuba,dc=mycompany,dc=co,dc=jp
objectClass: inetOrgPerson
uid: S0205
sn: hanako
cn: Yamato Hanako
mail: jugyouina@dep.mycompany.co.jp
userPassword:: *************************
structuralObjectClass: inetOrgPerson
creatorsName: cn=admin,dc=syokuba,dc=mycompany,dc=co,dc=jp
createTimestamp: 20090413032409Z
entryCSN: 20090413032409.000000Z#000005#000#000000
modifiersName: cn=admin,dc=syokuba,dc=mycompany,dc=co,dc=jp
modifyTimestamp: 20090413032409Z
dn: uid=S0206,ou=mailsys,dc=syokuba,dc=mycompany,dc=co,dc=jp
objectClass: inetOrgPerson
uid: S0206
sn: tarou
mail: tarou@jimu.mycompany.co.jp
structuralObjectClass: inetOrgPerson
creatorsName: cn=admin,dc=syokuba,dc=mycompany,dc=co,dc=jp
createTimestamp: 20090413032409Z
cn: Ooshiro Kuniko
userPassword:: *************************
entryCSN: 20090417025558.000000Z#000001#000#000000
modifiersName: uid=S0206,ou=mailsys,dc=syokuba,dc=mycompany,dc=co,dc=jp
modifyTimestamp: 20090417025558Z
【サンプルプログラム】 perl ldif2csv.pl filename.ldif
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
#!/opt/local/bin/perl #厳格モードを使用する(文法チェックが厳しくなる) use strict; use utf8; my $datafile = $ARGV[0]; my $line = ""; my $current_first_value = ""; my $pre_first_value = ""; my %values = ""; my @exception = () ;#($headers[0], "creatorsName", "modifiersName"); #「<」読み込むモードでファイルを開く open(IN, "<$datafile"); #ヘッダーの配列を定義する my @headers=(); while ( $line = <IN>) { if (! $line =~ /^$/ && $line =~/^(.*):(.*)$/){ my $header = $1 ; $header =~ s/://g; #余計な:を除く # @headers に存在しない場合、@headers追加する if ( ! grep {$_ eq $header} @headers ) { push (@headers, $header);} } } close(IN); #Title の行を吐き出す print join("," , @headers) . "\n"; #「<」読み込むモードでファイルを開く open(IN, "<$datafile"); while ( $line = <IN>) { if (! $line =~ /^$/){ #ヘッダーごとの値を取得 foreach my $header (@headers){ #print "$header\n"; my $patten = "^$header:(.*)"; if ($line =~/$patten/){ my $value = $1; $value =~ s/^\s+//; $value =~ s/\s+$//; #値内の, を ; に置き換え $value =~ s/,/;/g; if ($header eq $headers[0] ){ $current_first_value = $value; #dn 変わったら、書き出す if ($pre_first_value ne "" && $pre_first_value ne $current_first_value ){ $values{$headers[0]} = $pre_first_value; #全てのvalues を書き出す my $output = ""; foreach my $h (@headers){ #最後の | をトル if (exists($values{$h})) {$values{$h} =~ s/\s\|\s$//;} if (! grep {$_ eq $h} @exception){ #print $h."\n"; if (exists($values{$h})){ $output .= $values{$h}.","; } else { $output .= "<NULL>,"; } } } #最後の,をトル $output =~ s/,$//; print "$output\n"; #次のレコードのための空箱を用意する %values = (); } $pre_first_value = $current_first_value; } else { if (exists($values{$header})){ $values{$header} .= "$value | "; } else { $values{$header} = $value; } } } } } } #最後の レコード を出力する my $output = ""; $values{$headers[0]} = $current_first_value; foreach my $h (@headers){ if (! grep {$_ eq $h} @exception){ #最後の | をトル if (exists($values{$h})) {$values{$h} =~ s/\s\|\s$//;} if (exists($values{$h})){ $output .= $values{$h}.","; } else { $output .= "<NULL>,"; } } } #最後の,をトル $output =~ s/,$//; print "$output\n"; close(IN); |
変換した結果はこちら:
|
dn,objectClass,uid,sn,cn,mail,userPassword,structuralObjectClass,creatorsName,createTimestamp,entryCSN,modifiersName,modifyTimestamp uid=S0205;ou=mailsys;dc=syokuba;dc=mycompany;dc=co;dc=jp,inetOrgPerson,S0205,hanako,Yamato Hanako,jugyouina@dep.mycompany.co.jp,: *************************,inetOrgPerson,cn=admin;dc=syokuba;dc=mycompany;dc=co;dc=jp,20090413032409Z,20090413032409.000000Z#000005#000#000000,cn=admin;dc=syokuba;dc=mycompany;dc=co;dc=jp,20090413032409Z uid=S0206;ou=mailsys;dc=syokuba;dc=mycompany;dc=co;dc=jp,inetOrgPerson,S0206,tarou,Ooshiro Kuniko,tarou@jimu.mycompany.co.jp,: *************************,inetOrgPerson,cn=admin;dc=syokuba;dc=mycompany;dc=co;dc=jp,20090413032409Z,20090417025558.000000Z#000001#000#000000,uid=S0206;ou=mailsys;dc=syokuba;dc=mycompany;dc=co;dc=jp,20090417025558Z |