2011-06-23 20 views
0

現在、JavaでCSVファイルを読み込む必要があるプログラムを作成しています。今、私はファイルが正しくロードされている、それは問題ではない、と私はcsvファイルからデータベースにユーザー情報を追加したい。しかし、それは価値のリストとして出てくる。JavaでのCSVファイルのインポート

私のファイル形式である
first_name1, last_name1,(group1,group2,group3) 
first_name2, last_name2,(group1,group2,group3) 

以下のようにので、どのように私はこのすべてを分割して、データベースに保存する必要があり

firstname1,lastname1,group1 
firstname1,lastname1,group2 
firstname1,lastname1,group1 
firstname2,lastname2,group1 
... 

としてデータベースに追加したいですか?

ファイルには、データベースに格納したいレコードがあります。だれかがそれについて考えているのであれば、教えてください。

多くの提案があります。

+1

各グループを反復して挿入しますか?あなたは正規表現か標準のstring.splitのどちらかを使ってトークンを分割し、forループを使って繰り返しを行うことができます。 – Mikola

+0

これはかなりシンプルです:既存のCSVリーダーを使用してファイルを読み込みます(openbyteのものではなく、Excelで生成されたCSVファイルを処理できません)、行ごとに読み込み、各行を複数のデータベースレコードに変換し、データベースの各レコードを保存します、ファイルを閉じ、データベースアクションをコミットし、データベース接続を閉じます。 –

+0

@Mikola、Roland lllig:CSVファイルを分割する例を教えてください。基本的にはDTOクラスの構造が必要です。文字列firstnameなど。 string lastname、リストグループ[];どのように私はこれに追加し、データベースに格納することができますか? – Raje

答えて

1
  • 変数(StringTokenizerは)
  • が一緒にクエリ(String)を入れ
  • へ(forループ)ライン

  • ブレークアップ回線経由でファイル(BufferedFileReader)
  • 反復を読みますお使いのデータベースにクエリを実行(SQL)

    public void test(String line) { 
        List<String> list = new ArrayList<String>(); 
        StringTokenizer t1 = new StringTokenizer(line, ","); 
        String firstName = (String) t1.nextElement(); 
        String lastName = (String) t1.nextElement(); 
        String temp = (String) t1.nextElement(); 
        temp = temp.replaceAll("(", "").replaceAll(")", ""); 
        List<String> usergroups = new ArrayList<String>(); 
        StringTokenizer t2 = new StringTokenizer(temp, ","); 
        while (t2.hasMoreElements()) { 
         String element = (String) t2.nextElement(); 
         usergroups.add(element); 
        } 
    } 
    
+0

@molske:CSVファイルを分割するためのいくつかの例がありますか?基本的にはDTOクラスの構造が必要です。文字列firstnameなど。 string lastname、リストグループ[];どのように私はこれに追加し、データベースに格納することができますか? – Raje

+0

どのように処理するかのヒントを得るためには、まだテストされていないバージョン – Molske

+0

@molske:次の行に使用されるもの "リスト list = new ArrayList ();" – Raje

0

opencsvと呼ばれるライブラリがありますが、それはあなたのために大変です。

<dependency> 
     <groupId>net.sf.opencsv</groupId> 
     <artifactId>opencsv</artifactId> 
     <version>2.1</version> 
    </dependency> 

私はそれを使用しましたし、それをお勧めすることができます:それは自動的など

Mavenの依存定義がある、二重引用符で囲まれた値の中に埋め込まれ、コンマのような問題を扱います。

+0

この新しい面白いものをありがとう。これに関する詳細や例を提供することができますか?基本的に私はすべてのこのユーザー情報を私のuserDTOクラスに割り当てたいと思う。だから私はこれのためにDTOを作成し、この値をuserDTOクラスに割り当て、データベースに格納することができます – Raje

0

openCSVを調べる必要があります。これらは、列に名前を付けてDTOにマップするためのjavabeansマッピングをサポートしています。http://opencsv.sourceforge.net/#javabean-integration 括弧で囲んでいるグループネストがあります。 ファイルの制作を管理している場合は、 '('と ')'の区切り記号をカンマ以外のものに置き換えます。そうすれば、CSVパーサは最初のパスのパーサを無視できます。あなたは、簡単に、DBにそれを置く豆のコレクションを、各Beanの反復、を反復するには

String[] groups = tempGroups.split("[();]") 

を使用してグループを分割することができます

firstname: John 
lastname: Doe 
tempGroups: (group1;group2) 

:あなたは次のように豆を持っています個々のユーザーをグループに追加するグループの集まり。

for (User user:Users) { 
    for (String group:user.getGroups()) { 
     db.insert(user.getFirstname(), user.getLastName(), group); 
    } 
} 
+0

@bohemian:この新しい興味深いものをありがとう。これに関する詳細や例を提供することができますか?基本的に私はすべてのこのユーザー情報を私のuserDTOクラスに割り当てたいと思う。どのように私はこのためのDTOを作成し、userDTOクラスにこのすべての値を割り当てることができ、データベースに格納されます – Raje

+0

User.InユーザーのためのDTOクラスを作成する必要がありますどのように詳細を構成する firstname、lastname、lastname.role、group1#group#group3 。基本的にroleはgroup1、group2、group3です。 – Raje

関連する問題