2015-11-18 10 views
9

かなり複雑なJavaオブジェクトからCSVファイルを生成しようとしています。オブジェクトは、いくつかの属性を持つセッションであり、文字列とメッセージのリストには、いくつかの属性と、いくつかの属性を持つコメントのリストがあります。複雑なJavaオブジェクトからCSV

セッションクラスは次のとおりです。

public class Session { 

    private Long id; 

    private Date startDate; 

    private Date endDate; 

    private List<Message> messages; 

    private List<String> participants; 

    public TweetSession() { 
    } 

    public TweetSession(Date startDate, List<Message> messages, List<String>  participants) { 
     this.startDate = startDate; 
     this.messages = messages; 
     this.participants = participants; 
    } 

    public Long getId() { 
     return id; 
    } 

    public Date getStartDate() { 
     return startDate; 
    } 

    public void setStartDate(Date startDate) { 
     this.startDate = startDate; 
    } 

    public Date getEndDate() { 
     return endDate; 
    } 

    public void setEndDate(Date endDate) { 
     this.endDate = endDate; 
    } 

    public List<Message> getMessages() { 
     return messages; 
    } 

    public void setMessage(List<Message> messages) { 
     this.message = message; 
    } 

    public List<String> getParticipants() { 
     return participants; 
    } 

    public void setParticipants(List<String> participants) { 
     this.participants = participants; 
    } 
} 

メッセージクラスは次のとおりです。

public class Message { 

    private Long id; 

    private Session session; 

    private Date date; 

    private String participant; 

    private String content; 

    private List<Comment> comments; 

    public Message() { 
    } 

    public Message(String participant, Session session, Date date, String content) { 
     this.participant = participant; 
     this.session = session; 
     this.content = content; 
     this.date = date; 
     this.comments = new ArrayList<>(); 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getParticipant() { 
     return participant; 
    } 

    public void setParticipant(String participant) { 
     this.participant = participant; 
    } 

    public String getContent() { 
     return content; 
    } 

    public void setContent(String content) { 
     this.content = content; 
    } 

    public List<Comment> getComments() { 
     return comments; 
    } 

    public void setComments(List<Comment> comments) { 
     this.comments = comments; 
    } 

    public void addComment(Comment comment) { 
     this.comments.add(comment); 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    public TweetSession getSession() { 
     return session; 
    } 

    public void setSession(TweetSession session) { 
     this.session = session; 
    } 
} 

コメントクラス。

public class Comment { 

    private Long id; 

    private Message message; 

    private String participant; 

    private String message; 

    private Date date; 

    public Comment() { 
    } 

    public Comment(String participant, Message message, String content, Date date) { 
     this.participant = participant; 
     this.content = content; 
     this.message = message; 
     this.date = date; 
    } 

    public String getParticipant() { 
     return participant; 
    } 

    public void setParticipant(String participant) { 
     this.participant = participant; 
    } 

    public Message getMessage() { 
     return message; 
    } 

    public void setMessage(Message message) { 
     this.message = message; 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getContent() { 
     return content; 
    } 

    public void setContent(String content) { 
     this.content = content; 
    } 
} 

これをCSVファイルにマッピングできるかどうかは疑問です。セッションオブジェクトをJSON形式に変換し、そのJSONをオンラインジェネレータのCSVに変換すると、適切な出力が得られるので、それが可能でなければならないと思います。私はちょうど方法を本当に知らない。 私はこのようにnet.sf.supercsvライブラリを使用しようとしました。

public void generateCSV(Session session, HttpServletResponse response) throws IOException { 
    String csvFileName = "session.csv"; 
    response.setContentType("text/csv"); 

    String headerKey = "Content-Disposition"; 
    String headerValue = String.format("attachment; filename=\"%s\"", 
      csvFileName); 
    response.setHeader(headerKey, headerValue); 

    ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter(), 
      CsvPreference.STANDARD_PREFERENCE); 

    // Generate header for the CSV 
    Field fields[] = session.getClass().getDeclaredFields(); 
    String[] header = new String[fields.length]; 
    for (int i = 0; i < fields.length; i++) { 
     header[i] = fields[i].getName(); 
    } 

    csvWriter.writeHeader(header); 

    // Generate CSV content from data 
    csvWriter.write(session, header); 

    csvWriter.close(); 
} 

しかし、これはもちろん望ましい結果を与えません。

誰でも正しい方向に向けることができますか?事前に

おかげで、

ニールス

編集:私はこれをCSVに変換する場合

{ 
    "id": 22, 
    "startDate": 1447368081000, 
    "endDate": null, 
    "messages": [ 
     { 
      "id": 10, 
      "date": 1447368159000, 
      "participant": "1", 
      "content": "This is a message", 
      "comments": [] 
     }, 
     { 
      "id": 11, 
      "date": 1447368168000, 
      "participant": "1", 
      "content": "This is also a message", 
      "comments": [] 
     }, 
     { 
      "id": 12, 
      "date": 1447368179000, 
      "participant": "1", 
      "content": "This is another message", 
      "comments": [ 
       { 
        "id": 10, 
        "participant": "1", 
        "message": "This is a comment", 
        "date": 1447368227000 
       }, 
       { 
        "id": 11, 
        "participant": "1", 
        "message": "This is also a comment", 
        "date": 1447368234000 
       } 
      ] 
     } 
    ], 
    "participants": [ 
     "1", 
     "23" 
    ] 
} 

は、私が何かを得る:これは、JSON形式のサンプルセッションがある

このように:

実際、(単一の)CSVがこの問題に対する最良のアプローチではないかもしれないと考え始めました。

+4

csvはリレーショナルデータの適切なフォーマットではないようです。 csv形式は、データの表を表すのに適しており、各行は意味的に類似しています。関係する構造の種類を表現したい場合は、大量のデータを複製して多くの行を空白にしたり、多数の個別のcsvファイルを作成したりする必要があります。 期待される最終結果がcsvでどのように見えるかのサンプルを提供してもらえますか? – jvalli

+0

十分に公正で、クライアントはデータをダウンロードし、CSVを求めます。たぶん私はクライアントに別の形式を受け入れるように説得することができます。あなたのご意見ありがとうございます! –

+0

リストPOJOからCSVを作成して、クライアント用のファイルを作成しました。私のアンヴェールをご覧ください –

答えて

4

あなたが持っているデータが1多くあります。その中のn依存関係を本当に単一 CSVファイルには向いていません。私が使用したり、このために使用さ見てきました

アプローチ:

  • 一つSessionの独自のデータを持つ「ハイブリッド」CSV、すなわちidstartDate、最初の列のendDateして、メッセージ用の2​​つの列と参加者は、JSONとして印刷

    "123", "2015-11-17", "2015-11-18", "[{id: 345, date: ...}, {id: 789, date: ...}]", "[...]" 
    

    (あなたが,"秒を含む値をエスケープ良いCSVライブラリを使用する必要があります注意してください)

  • 複数のCSVファイル - つまり、あなたの構造のためのリレーショナルデータベースをモデル化したいあなたのようにモデル化

    • 含むsessions.csv idstartDateidsession_iddateを含むendDate
    • messages.csv 、...
    • ...

    その後、1つのファイルをZIP形式でダウンロードしてください。

  • より正確な仕様を求めるユーザーに、データで何をしようとしているのかを確認し、データの「表示」を有効にする形式データベースのビューとレポートを作成してユーザーにタスク指向のデータビューを提供する方法と同じです。
+0

あなたのご意見ありがとうございます、私は私の質問にいくつかのサンプルJSONを追加しました。私はあなたが正しいと思う、私はこの問題のために(単一の)CSVを使うべきではないと思う。クライアントは、Excelなどのデータを簡単に表示できるようにしたいだけです。私は彼の心を変えようとします。 –

+1

まだ、彼がそのデータで見たいものを見つけようとしています。たとえば、メッセージがセッションにどのように関連しているかを確認したい場合は、「session_id、startDate、endDate、messageId、messageDate、messageContent」という各「セッション - メッセージ」リレーションごとに1行のCSVを与えることができますデータベースのデータを見たいと思えば、彼らのためのビューを準備する。 –

+0

私は彼にJSONまたはXMLを受け入れるように説得することができるとは思うが、これを行うだろう。 –

2

私たちは、私はあなたが何か

0

が必要な場合は、私が代わりにApache Commons CSVを使用することをお勧め知ってみましょう。この

public void exportIronData(String destinationFilePath, 
     List<ExportIronDataFileFormatDTO> dataList) throws Exception { 
    try { 
     if (validationUtil.isNullOrEmpty(destinationFilePath) 
       || validationUtil.isNullOrEmpty(dataList)) { 
      return; 
     } 
     ColumnPositionMappingStrategy<ExportIronDataFileFormatDTO> strategy = new ColumnPositionMappingStrategy<ExportIronDataFileFormatDTO>(); 
     strategy.setType(ExportIronDataFileFormatDTO.class); 
     String[] columns = IlmcrCsvFileConstants.EXPORT_IRONDATA_COLUMN_HEADERS; 
     strategy.setColumnMapping(columns); 
     CSVWriter writer = new CSVWriter(
       new FileWriter(destinationFilePath), 
       IlmcrCsvFileConstants.exportIronDataSeperator, 
       CSVWriter.NO_ESCAPE_CHARACTER, System.getProperty("line.separator")); 
     BeanToCsv<ExportIronDataFileFormatDTO> exportFormat = new BeanToCsv<ExportIronDataFileFormatDTO>(); 
     exportFormat.write(strategy, writer, dataList); 
     writer.flush(); 
     writer.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw e; 
    } 
} 

を達成するためにopenCSV

com.opencsv.bean.BeanToCsvを使用。メーリングリストの管理など、いくつかのプロジェクトで使用しています。

Reader in = new StringReader("a,b,c"); 
for (CSVRecord record : CSVFormat.DEFAULT.parse(in)) { 
    for (String field : record) { 
     System.out.print("\"" + field + "\", "); 
    } 
    System.out.println(); 
} 


Output: "a", "b", "c", 
+0

このコードではCSVが生成されたか、CSVが読み込まれましたか? –

+0

これは、1:nの関係をCSVに出力するのにどのように役立ちますか? –

+0

@MahendranAyyarsamyKandiarはい、CSVを生成します。私は答えを私の答えに加えました。 – johnnieb

0

ハイブリッドCSV形式を使用する必要があります。私は同じ問題を抱えていましたので、私は軽量フレームワークを作りました。ソースコードまたはサンプルをコピーすることができます。https://github.com/abhisoni96/export-entity

データメンバーに基づいてコレクションごとに独自のフォーマッタを作成できます。上記リンクの例を参考にしてください。

0

json2flat.
というライブラリがあります。複雑なJSONドキュメントを受け取り、それをCSV形式に変換します。

JavaオブジェクトをJSON形式に変換する必要があります。
の後に、生成されたJSONをライブラリに渡す必要があり、それはJSONの2D
表現を返します。また、そこからcsvを取得することもできます。

このライブラリは成熟していませんが、それでも有望です。
試してみてください。

関連する問題