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

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

ただいまの
回答率

90.51%

  • Java

    15822questions

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

  • CSV

    854questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 738

kazuhirosa

score 5

こんにちは。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("&lt;");
break;
case '>' :
strOutput.append("&gt;");
break;
case '&' :
strOutput.append("&amp;");
break;
case '"' :
strOutput.append("&quot;");
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>

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • momon-ga

    2017/06/22 16:54

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

    キャンセル

  • kazuhirosa

    2017/06/22 17:01

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

    キャンセル

  • momon-ga

    2017/06/22 17:06 編集

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

    キャンセル

  • kazuhirosa

    2017/06/22 17:46

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

    キャンセル

回答 4

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/22 17:47

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

    キャンセル

  • 2017/06/22 18: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が楽になるというメリットはありますが。

    キャンセル

  • 2017/06/26 10:04

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/22 17:46

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/22 17:48

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

    キャンセル

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/26 10:00

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

    キャンセル

  • 2017/06/26 21:01

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

    キャンセル

  • 2017/06/27 12:03

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

    キャンセル

同じタグがついた質問を見る

  • Java

    15822questions

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

  • CSV

    854questions

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