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

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

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

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

Java

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

Q&A

解決済

4回答

4225閲覧

Javaを用いて、CSVファイルの検索を行い、出力する

kazuhirosa

総合スコア15

CSV

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

Java

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

0グッド

0クリップ

投稿2017/06/22 07:42

編集2017/06/26 05:44

こんにちは。Java初心者のKazuです。
今回もお忙しいところ恐れ入りますが、ご教授いただけますと幸いです。
よろしくお願い申し上げます。

###前提・実現したいこと
HTMLで作成したページにて、入力した条件に合うCSVのデータを抽出するプログラムを書きたいと考えています。
検索条件は以下に記します。

(追記)
ソースコードを書き換えたところ、ファイルの読み込みに失敗してしまいます。
なぜでしょうか?
ご教授いただけますと幸いです。

###想定していたことと結果
想定:検索結果に一致したレコードが出てくる
現状:ソースコードが表示されるだけになっている

###該当のソースコード

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>document management system</title> </head> <body> <center> <h1 style="background-color:#42EB66">書類検索</h1> </center> <p>注文書番号、請求書番号、業者名、日付範囲を入力し、検索ボタンをクリックして下さい。 </p> <br> <form action="result.jsp" method="post"> 請求書番号<input type="text" name="number1"> <br> <br> 注文書番号<input type="text" name="number2"> <br> <br> 業者名 <input type="text" name="name"> <br> <br> 金額(下限)<input type="number" name="cost" min="0" max="10000000"> 金額(上限)<input type="number" name="cost" min="0" max="10000000"> <br> <br> 日付(開始)<input type="date" name="date1"> 日付(終了)<input type="date" name="date2"> <br> <br> <br> <br> <br> <br> <center> <input type="submit" value="検索"> <input type="reset" value="リセット"> </center> <br> <br> <br> </form> </body> </html>

###該当のソースコード2

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ page language="java" contentType="text/html; charset=SJIS"
pageEncoding="SJIS"%>
<%@page import="java.io., java.util., java.util.regex.*" %>
<%!
private String escapeChar(String strInput){
StringBuffer strOutput=new StringBuffer();
for(int i=0;i<strInput.length();i++){
switch(strInput.charAt(i)){
case '<' :
strOutput.append("<");
break;
case '>' :
strOutput.append(">");
break;
case '&' :
strOutput.append("&");
break;
case '"' :
strOutput.append(""");
break;
default :
strOutput.append(strInput.charAt(i));
break;
}
}
return strOutput.toString();
}
%>

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=SJIS"> <title>resultcsv</title> </head> <body> <% request.setCharacterEncoding("SJIS"); String searchBuilding1 = escapeChar(request.getParameter("number1")); String searchBuilding2 = escapeChar(request.getParameter("number2")); String searchBuilding3 = escapeChar(request.getParameter("name")); String searchBuilding4 = escapeChar(request.getParameter("cost1")); String searchBuilding5 = escapeChar(request.getParameter("cost2")); String searchBuilding6 = escapeChar(request.getParameter("date1")); String searchBuilding7 = escapeChar(request.getParameter("date2")); %> <h1>検索結果</h1> <h2>検索条件:「<%=searchBuilding1%>」、「<%=searchBuilding2%>」、「<%=searchBuilding3%>」を含む</h2> <table border="1"> <tr> <th>注文書番号</th> <th>請求書番号</th> <th>業者名</th> <th>日付</th> <th>金額</th> </tr>

<%
String tmp;
StringTokenizer stk;
File f = new File("results.csv");
FileInputStream input = new FileInputStream(f);
InputStreamReader fr = new InputStreamReader(input,"SJIS");
BufferedReader br = new BufferedReader(fr);
int i, num, flag=0;
String[] strData = new String[10];

Pattern searchPattern1 = Pattern.compile(searchBuilding1);
Pattern searchPattern2 = Pattern.compile(searchBuilding2);
Pattern searchPattern3 = Pattern.compile(searchBuilding3);
Pattern searchPattern4 = Pattern.compile(searchBuilding4);
Pattern searchPattern5 = Pattern.compile(searchBuilding5);
Pattern searchPattern6 = Pattern.compile(searchBuilding6);
Pattern searchPattern7 = Pattern.compile(searchBuilding7);

while (br.ready()) {

tmp = br.readLine(); stk = new StringTokenizer(tmp, ","); num = stk.countTokens(); for (i=0; i<num; i++) { strData[i] = (String) stk.nextToken(); } /* Matcher searchMatcher1 = searchPattern1.matcher(strData[0]); Matcher searchMatcher2 = searchPattern2.matcher(strData[1]); Matcher searchMatcher3 = searchPattern3.matcher(strData[2]); Matcher searchMatcher4 = searchPattern4.matcher(strData[3]); Matcher searchMatcher5 = searchPattern5.matcher(strData[3]); Matcher searchMatcher6 = searchPattern6.matcher(strData[4]); Matcher searchMatcher7 = searchPattern7.matcher(strData[4]); */ int cost = Integer.parseInt(strData[3]); int cost1 = Integer.parseInt("cost1"); int cost2 = Integer.parseInt("cost2"); if (strData[0]=="number1"&&strData[1]=="number2"&&strData[2]=="name"&&(cost>=cost1||cost<=cost2)&& (strData[4].compareTo("date1")<0&&strData[4].compareTo("date2")>0)) { out.println("<tr>"); for (i=0; i<num; i++) { out.println("<td>" + strData[i] + "</td>"); } out.println("</tr>"); flag = 1; }

}
br.close();
%>

</table>

<%
if (flag == 0) {
out.println("<p>該当する建物は見つかりませんでした。</p>");
}
%>

</body> </html>

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

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

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

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

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

momon-ga

2017/06/22 07:54

何に困ってるか、わからないのですが・・・設計してほしいのですか?
kazuhirosa

2017/06/22 08:01

プログラムをどのように組んだらいいのかわからないです。。。。
momon-ga

2017/06/22 08:09 編集

せめて、日本語で良いので手順を書かないと丸投げと思われて回答つきにくいですよ。 以前の質問のつづきだとは思いますが、情報が無いので適切な回答は難しいです。 普通に、FileReaderで、CSV読んで、検索条件の文字列があれば、画面に表示するでよいかと。
kazuhirosa

2017/06/22 08:46

ご回答ありがとうございます。ソースコードを考えて、実行してみましたが、うまくいきませんでした。。
guest

回答4

0

ソースは読んでないのですが、なにがうまく行っていないのか説明ください。

想定していた内容:
実際の結果:

みたいな感じで。

ちなみに、検索条件を無視して全件表示しようとした場合は、CSVの内容は表示されますか?

追記(2/17/06/26)
CSVの画面が表示できていないようなので、問題を切り分けましょう。

if (strData[0]=="number1"&&strData[1]=="number2"&&strData[2]=="name"&&(cost>=cost1||cost<=cost2)&& (strData[4].compareTo("date1")<0&&strData[4].compareTo("date2")>0)) {

この部分を削除して、CSVが表示されるなら、この条件式に問題があるので修正。
そもそも、表示されないならCSVの読み取りができていないので、Readerの使い方を調べてください。(whileのところ)

投稿2017/06/22 08:55

編集2017/06/26 09:23
momon-ga

総合スコア4820

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

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

kazuhirosa

2017/06/26 01:00

ご回答ありがとうございます。編集いたしました。 CSVの内容は表示されません。
kazuhirosa

2017/06/26 12:01

追記拝読しました。 問題を切り分けて再構築してみます。ありがとうございます。
momon-ga

2017/06/27 03:03

あ、そもそも文字列比較でequals使ってない時点でアウトでは?
guest

0

HTMLで作成したページにて、入力した条件に合うCSVのデータを抽出するプログラム
というのは
ブラウザ上で入力した条件をサーバサイド(Javaのモジュール)で処理してDBを参照しCSV出力するイメージでしょうか。
そうであればCSVの出力に関してはご自身で設計するよりはSpringやPlayといったJavaのフレームワークを利用される方が、実装の仕方もWEB上ですぐ検索できて簡単かと思います。

投稿2017/06/22 08:18

miyasaka

総合スコア271

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

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

kazuhirosa

2017/06/22 08:48

フレームワークのほうが良いのですね!そちらでも検討してみます!ありがとうございます。
guest

0

ベストアンサー

どなたかが回答してくれると思いますが、いずれにしても情報が足りない。ちょっと思いつくままに書きますが。
・そもそもサーブレットによるサーバーサイドプログラム(TomcatとかWildfiyとかspring-bootとかつかったいわゆるWEB)?
・このHTMLを書き出すのもJavaでやるの(初級プログラムなら大概そうだと思いますが。JSPとかJSFとかThymeleafとか。もちろんAPIベースならHTMLと検索機能別にもできるが。)?
・CSVはただのテキストファイル?それともデータベースかなにかに格納されているの?
・CSVがただのテキストファイルだとしたらどこに置いてあるの(クライアントorサーバ)?
・その他技術選択は自由ですか("Java"という以外になにか決まってるのでは)?
一旦ここまで。
想像するにオーソドックスなサーブレットプログラムを期待していると思いつつも、本当に"CSVファイルを検索するサーバサイドプログラム"なら結構珍しい。

投稿2017/06/22 08:16

kurokoba

総合スコア276

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

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

kazuhirosa

2017/06/22 08:47

少しでも情報を付加しようと思い、ソースコードを書いてみました、、
kurokoba

2017/06/22 09:26

ソースの添付ありがとうございます。大分やりたい事のイメージが伝わりました。 まず 段階ごとの開発をしてみてはどうでしょうか? 1.画面を表示する 2.リクエストされた情報をサーバー側でうけとる 3.サーバ側で設定した値を画面(HTML)に表示する 4.ファイルを読み取る処理を作る 5.引数に応じてファイルの内容を検索する処理を作る 6.1-3と4-5でできたものをつなげる 1-3と5-6は独立して進められます(5-6はwebでなくpabulic static void mainから起動するプログラムをとりあえず作れば良い)。 できそうな方からやってみれば良いと思います。 ひとつひとつはそんなに難しくないしだれかに質問するにしても検索するにしても回答を見つけやすい。 なにより問題の所在がはっきりしやすいです(バーっと全部作ってしまうとどこが問題かわかりません。そもそも職業プログラマもそうします)。 製品レベルのものを作るとなると+α必要ですが(並行性とかセキュリティとかエラーハンドリングとか)それはまた質問すればよいです。 ちょっと欲をいえば、JSP内にファイル検索処理を書かない方法を覚える(HttpServletRequestを継承する方法でもフレームワークでも良いですが)のが望ましい。 いろんな意味で(職業訓練的にも開発フェイズを分けるという意味でも要件的にも)。 まあお手軽なので上記1が楽になるというメリットはありますが。
kazuhirosa

2017/06/26 01:04

ご丁寧に回答いただきまして、ありがとうございます。 段階ごとに開発してみます!
guest

0

どのようにプログラムを設計すればいいのかわかりません。

まずは処理の内容をフローチャートに書いてみてはどうでしょう?

投稿2017/06/22 08:05

tkturbo

総合スコア5572

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

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

kazuhirosa

2017/06/22 08:46

かみ砕いて、ソースコードを書いてみましたが、うまく動作しませんでした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問