0

IT 企業でのインターンシップで、CSV ファイルを LDIF ファイル形式に変換するためのスクリプトまたは Java プログラムを作成するタスクが割り当てられました。LDIF ファイル形式は、多くの組織が多くのユーザーのディレクトリに入力/変更/削除するために使用していると思います. CSV ファイルを LDIF ファイルに変換するのに役立つ Java プログラムを作成しようとしています。次に、この LDIF ファイルを e-directory にインポートして、新しいユーザーを追加します。現在、機能する単純なプログラムがありますが、提供できない大幅な拡張が必要です。


サンプル CSV ファイルのスクリーンショット (1 行目がヘッダー):
csv ファイルのサンプル
Notepad++ のサンプル CSV ファイル: Notepad++の
csv ファイル
(1 行目がヘッダーです。行の各要素はカンマ (,) で区切られます)

サンプル LDIF ファイル以下のサンプルコードを使用して生成されます (OUTPUT):

dn: cn=demotest1, ou=Data, o=Data
changetype: add
ou: Data
objectClass: dt1
objectClass: test_demo1
objectClass: demotest1
objectClass: Employee
cn: demotest1
uid: test_demo1
SAMAccountName: demt1
givenName: demotest1
sn: dt1

dn: cn=demotest2, ou=Data, o=Data
changetype: add
ou: Data
objectClass: dt2
objectClass: test_demo2
objectClass: demotest2
objectClass: Employee
cn: demotest2
uid: test_demo2
SAMAccountName: demt2
givenName: demotest2
sn: dt2


注: ヘッダーとしての最初の行は出力から除外されます。CSV ファイルの各行は一連のデータ (行 = dn: から sn:) に変換され、各データ セットは空白行で区切られます。

以下は、上記の LDIF ファイルを生成するために使用したコード サンプルです。

package readcsv;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
/**
 *
 * @author Dorjee
 */

public class ReadCSV {

    public static void main(String[] args) {
        ReadCSV obj = new ReadCSV();
        obj.run();
    }

    public void run() {

        String csvFile = "/Users/Dorjee/Desktop/sampleCSV.csv"; //Path of file to be read.
        BufferedReader br = null;
        String line = "";
        String csvSplitBy = ",";        
        String[] column;

        int count = 0;

        try {

            PrintStream out = new PrintStream(new FileOutputStream("OutputLDIFFile.ldif"));
            br = new BufferedReader(new FileReader(csvFile));

            while ((line = br.readLine()) != null) {

                // using comma as separator
                column = line.split(csvSplitBy);

                //End format of the ouput file.
                //Change according to .CSV file.
                //Count used to exclude the reading of the first line.
                if (count > 0) {
                    out.println("dn: cn="+column[5]+", ou="+column[7]+", o=Data"+
                            "\nchangetype: " + column[2]
                            + "\nou: " + column[7]
                            + "\nobjectClass: " + column[3]
                            + "\nobjectClass: " + column[4]
                            + "\nobjectClass: " + column[5]
                            + "\nobjectClass: " + column[6]
                            + "\ncn: " + column[5]
                            + "\nuid: "+column[4]
                            + "\nSAMAccountName: "+column[1]
                            + "\ngivenName: "+column[0]
                            + "\nsn: "+column[3]
                            + "\n"
                    );
                }
                count++;

            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("Done");
    }

}

これは、CSV ファイルから LDIF ファイルを生成するのに役立つ簡単なコードです。ここで生成されるデータのセットは数千行に及ぶ可能性があるため、これは役に立ちます。しかし、このコードは明らかに適切ではありません。ご覧のとおり、さまざまな列数を持つ別の CSV ファイルを LDIF ファイルに変換する必要があるたびに、上記の強調表示された領域のコードを変更する必要があります。50 列を超えるファイルに遭遇したため、かなりの時間がかかり、コードを手動で変更しているときにエラーが発生する可能性が高くなります。その上、一部の列には空の値があります (出力から除外する必要があります)。

• 空の値を出力から除外するにはどうすればよいですか?
• CSV ファイルの列数が異なる場合でも、出力の生成を自動化する方法はありますか? ArrayList を試しましたが、問題を解決する方法がわかりませんでした。

どんな種類の助けでも大歓迎です。こちらで質問するのは初めてなので、間違いが多々あるかもしれませんがご容赦ください。したがって、あらゆる種類のフィードバックも大いに役立ちます。ありがとうございました!

4

2 に答える 2

1

次のようなものは、空の列をスキップする必要があります。

out.println("dn: cn="+column[5]+", ou="+column[7]+", o=Data"+
                    "\nchangetype: " + column[2]
                    + ((column[7].length()>0)?"\nou: " + column[7]:"")
                    + ((column[3].length()>0)?"\nobjectClass: " + column[3]:"")
                    + ((column[4].length()>0)?"\nobjectClass: " + column[4]:"")
                    + ((column[5].length()>0)?"\nobjectClass: " + column[5]:"")
                    + ((column[6].length()>0)?"\nobjectClass: " + column[6]:"")
                    + ((column[5].length()>0)?"\ncn: " + column[5]:"")
                    + ((column[4].length()>0)?"\nuid: "+column[4]:"")
                    + ((column[1].length()>0)?"\nSAMAccountName: "+column[1]:"")
                    + ((column[0].length()>0)?"\ngivenName: "+column[0]:"")
                    + ((column[3].length()>0)?"\nsn: "+column[3]:"")
                    + "\n"
            );

列数も確認する必要がある場合:

out.println("dn: cn="+column[5]+", ou="+column[7]+", o=Data"+
                    "\nchangetype: " + column[2]
                    + ((column.length > 7 && column[7].length()>0)?"\nou: " + column[7]:"")
                    + ((column.length > 3 && column[3].length()>0)?"\nobjectClass: " + column[3]:"")
                    + ((column.length > 4 && column[4].length()>0)?"\nobjectClass: " + column[4]:"")
                    + ((column.length > 5 && column[5].length()>0)?"\nobjectClass: " + column[5]:"")
                    + ((column.length > 6 && column[6].length()>0)?"\nobjectClass: " + column[6]:"")
                    + ((column.length > 5 && column[5].length()>0)?"\ncn: " + column[5]:"")
                    + ((column.length > 4 && column[4].length()>0)?"\nuid: "+column[4]:"")
                    + ((column.length > 1 && column[1].length()>0)?"\nSAMAccountName: "+column[1]:"")
                    + ((column.length > 0 && column[0].length()>0)?"\ngivenName: "+column[0]:"")
                    + ((column.length > 3 && column[3].length()>0)?"\nsn: "+column[3]:"")
                    + "\n"
            );

ヘルパー関数を使用すると簡単になるかもしれませんが、少し醜いです。

static public String check(String column[],String line,int index) {
    return ((column.length > index && column[index].length()>0)?line + column[index]:"");
}

...

out.println("dn: cn="+column[5]+", ou="+column[7]+", o=Data"+
                    "\nchangetype: " + column[2]
                    + check(column,"\nou: ",7)
                    + check(column,"\nobjectClass: " ,3)
                    + check(column,"\nobjectClass: ",4)
                    + check(column,"\nobjectClass: ",5)
                    + check(column,"\nobjectClass: ",6)
                    + check(column,"\ncn: ",5)
                    + check(column,"\nuid: ",4)
                    + check(column,"\nSAMAccountName: ",1)
                    + check(column,"\ngivenName: ",0)
                    + check(column,"\nsn: ",3)
                    + "\n"
            );
于 2015-10-30T10:39:23.450 に答える