質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

1855閲覧

Javaのライブラリを使って、検索結果をCSVの出力ができない

masaking

総合スコア30

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2019/12/10 07:26

初めて、apache.commonsから外部ライブラリをインポートして、検索結果をCSVで出力する、というのにチャレンジしています。

参考サイト1を見ながらやり、テキストをcsvに出力はできたので、ライブラリのインポートと、パスを通すのは成功していると思います。

参考サイトその2を見ながら、MySQLからのデータを検索してCSVに出力することができずに困っています。

Java

1package action; 2 3import java.io.BufferedWriter; 4import java.io.File; 5import java.io.FileNotFoundException; 6import java.io.FileOutputStream; 7import java.io.IOException; 8import java.io.OutputStreamWriter; 9import java.sql.Connection; 10import java.sql.DriverManager; 11import java.sql.PreparedStatement; 12import java.sql.ResultSet; 13import java.sql.SQLException; 14import java.util.ArrayList; 15 16import javax.naming.NamingException; 17import javax.servlet.http.HttpServletRequest; 18import javax.servlet.http.HttpServletResponse; 19 20import org.apache.commons.beanutils.BeanUtils; 21import org.apache.commons.csv.CSVFormat; 22import org.apache.commons.csv.CSVPrinter; 23import org.apache.struts.action.Action; 24import org.apache.struts.action.ActionForm; 25import org.apache.struts.action.ActionForward; 26import org.apache.struts.action.ActionMapping; 27 28import form.UserForm; 29 30public class UserCSVAction extends Action { 31 public 32 ActionForward execute( 33 ActionMapping mapping, 34 ActionForm form, 35 HttpServletRequest request, 36 HttpServletResponse response) 37 38 throws 39 SQLException, 40 NamingException, 41 IllegalAccessException, 42 java.lang.reflect.InvocationTargetException, 43 Exception{ 44 45 request.setCharacterEncoding("UTF-8"); 46 String department =request.getParameter("department"); 47 48 final String JDBC_URL = "jdbc:mysql://localhost:3306/pcm?serverTimezone=JST"; 49 final String DB_USER = "root"; 50 final String DB_PASS = "y21password"; 51 52 try (Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)){ 53 54 String sql 55 = "SELECT user_id, user FROM pcm.users " + 56 "where department=?"; 57 58 PreparedStatement pStmt = conn.prepareStatement(sql); 59 pStmt.setString(1, department); 60 ResultSet rs = pStmt.executeQuery(); 61 62 ArrayList list = new ArrayList<>(); 63 64 while(rs.next()) { 65 UserForm uform = new UserForm(); 66 BeanUtils.setProperty(uform, "userID", rs.getString("user_id")); 67 BeanUtils.setProperty(uform, "user", rs.getString("user")); 68 list.add(uform); 69 } 70 71 // 出力関係 72 try (BufferedWriter bw = new BufferedWriter( 73 new OutputStreamWriter( 74 new FileOutputStream( 75 new File("C:\Users\A2482\Desktop\jikken.csv")), "shift-jis"))) { 76 77 CSVPrinter printer = CSVFormat.EXCEL.print(bw); 78 79 80 for(int i=0;i<list.size();i++) { 81 printer.printRecord((String)list.get(i)+"\r\n"); 82 } 83 84 85 }catch (FileNotFoundException e) { 86 e.printStackTrace(); 87 } catch (IOException e) { 88 e.printStackTrace(); 89 }return null; 90} 91} 92}

デバッグで確認したところ、少なくともlist.add(uform)までは、変数にされていることがわかりました。そのため、そのあとの出力の書き方がいけないのではないかと思うのですが、具体的にどうすればよいかがわからないです。

HTTPステータス 500 – Internal Server Error タイプ 例外報告 メッセージ サーブレットの実行により例外を投げました 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 javax.servlet.ServletException: サーブレットの実行により例外を投げました org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) filter.EncodingFileter.doFilter(EncodingFileter.java:30) 根本原因 java.lang.NoClassDefFoundError: org/apache/commons/csv/CSVFormat action.UserCSVAction.execute(UserCSVAction.java:77) org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) javax.servlet.http.HttpServlet.service(HttpServlet.java:660) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) filter.EncodingFileter.doFilter(EncodingFileter.java:30) 根本原因 java.lang.ClassNotFoundException: org.apache.commons.csv.CSVFormat org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188) action.UserCSVAction.execute(UserCSVAction.java:77) org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) javax.servlet.http.HttpServlet.service(HttpServlet.java:660) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) filter.EncodingFileter.doFilter(EncodingFileter.java:30)

commons-csv-1.7.jarは、参照ライブラリに配置しております。

エラーメッセージを見る篝、jarの配置が悪いのかも、とも思っています。

お知恵を拝借願えますでしょうか。

足りない情報がありましたらお申し付けください。

Windows
Microsoft Windows [Version 10.0.17763.737]
Widnows10 Pro version 1809
Eclipse
Version: 2019-09 R (4.13.0)
Build id: 20190917-1200

Tomcat
9.0
Java
C:\Program Files (x86)\Java\jre1.8.0_221
C:\Program Files (x86)\Java\jdk1.5.0
Mysql
mysql Ver 8.0.17 for Win64 on x86_64 (MySQL Community Server - GPL)
mysql-connector-java-8.0.17.jar

Struts
Specification-Version: 1.2.9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

参照ライブラリに配置

Webアプリケーションであれば、WEB-INF/lib に配置しなければなりません。

ないしはWebアプリケーション専用のクラスパスに追加が必要です。

投稿2019/12/10 08:12

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaking

2019/12/11 00:42

ありがとうございます。配置場所が間違っていました。難しいですね、、、 また、コードを for(int i=0;i<list.size();i++) { printer.printRecord(list.get(i)+"\r\n"); } に手直ししたうえで、CSVに出力したところ、 form.UserForm@30cae8a5 等のように、予想していたのとは違う値が出力されていたのですけど、これは何が原因なのでしょうか、、、、?
A-pZ

2019/12/11 04:06 編集

それは list.get(i)した クラスの文字列表現を定義していないからです。実際には 文字列を結合しているので、そのクラスの toString()メソッドが実行されます。特にtoString()されたときの実装がない場合は、そのクラスオ文字列表現が表示されますので、必要に応じtoString()を実装するか、ないしは getしたあとに出力したい内容を記述してください。
masaking

2019/12/11 05:22

http://www.b-prep.com/blog/?p=1317 を参考に、 for(int i=0;i<list.size();i++) { printer.printRecord(list.get(i).toString()+"\r\n"); } のようにtoStringメソッドを付け足しましたが、やはり表示が変わらないです。 基本的なことができていないので、何か参考になるサイトなどご教授願えないでしょうか、、、
A-pZ

2019/12/11 05:40

そもそもですが、list.get(i) で得られる内容はUserFormクラスだと思いますので、UserFormをCSVで出力できるように実装した方が良いでしょう。 UserFormがもつすべての値をCSVで出力できる実装を作りましょう。
masaking

2019/12/11 07:10

ご回答ありがとうございます。 配列をそのままCSVで出力できないことを初めて知りました。 for文の個所ですべての結果を出力できると思ったのですが、違うのですね。 実装方法を調べてみた結果、僕では見つけられず理解できなかったので、あきらめようと思います、、 ありがとうございます。 初心者には難しかったです。
masaking

2019/12/12 02:44

あきらめずに、再度トライしています。 https://techacademy.jp/magazine/22226 を参考に、 FileWriter fileWriter = null; try { fileWriter = new FileWriter("jikken.csv"); //リストの内容を順に処理 for (int i=0;i<list.size();i++) { fileWriter.append(i.getUserID()); fileWriter.append(COMMA); fileWriter.append(String.valueOf(i.getUser())); fileWriter.append(COMMA); fileWriter.append(i.getDepartment()); fileWriter.append(NEW_LINE); } すべての値を出力できるように、それぞれのDBのカラムに対して、getterメソッドを記述しました。 しかし、赤×がでて、型がintだと起動できないとあります。しかし、int型でないと繰り返し処理の足し算ができないため、ここからどうすればよいのかわかってないです、、、
A-pZ

2019/12/12 04:21

i はループ変数なので、getUserID などは持っていません。list.get(i) では。
masaking

2019/12/12 05:19

お返事ありがとうございます。 list.get(i)がgetUserIDを持っていると考え、UserFormにキャストしたうえで、もう一度トライしました。 ですが、やはり出力されるのは謎の文字列のままです。 //リストの内容を順に処理 for (int i=0;i<list.size();i++) { fileWriter.append(((UserForm) list.get(i)).getUserID()); fileWriter.append(((UserForm) list.get(i)).getUser()); fileWriter.append(((UserForm) list.get(i)).getDepartment()); } デバッグで確認したところ、listとiに配列は確かに入っていたので、どこがいけないのかさっぱりです。
A-pZ

2019/12/12 07:18

UserFormクラスを格納するのが確定しているなら、 ArrayList list = new ArrayList<>(); この段階で型を定義すべきです。そうすればキャストの記述が減らせます。 ArrayList<UserForm> list = new ArrayList<>(); for (int i=0;i<list.size();i++) { UserForm form = list.get(i); この状態で、form.getUserID(); の型は String になっていませんでしょうか?もし他の型に入っているならば、別途 form.getUserID() で取得できたオブジェクトから、文字列に変換するメソッドが実装されているのでは。
guest

0

実行時のクラスパスに commons csv が含まれてないとだと思います。java コマンドを指定して実行しているのであれば、引数を確認すると良いです。

投稿2019/12/10 07:36

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問