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

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

ただいまの
回答率

89.65%

JAVAでCSVファイルを読み込み、文字列のデータ型をチェックする方法

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 6,312

kumakumatan

score 163

CSVファイル内容
社員番号(ABC1582),社員名(漢字), 任意番号(124566),携帯番号(xxx-xxxx-xxxx)

読み込んでデータを配列にセットする。
その時、任意番号が整数型(int)かのチェック、携帯番号に(-)が含まれている
かのチェックをしたいのですが、そのような事は可能でしょうか。
チェックで引っかかったものをメッセージを表示するようにしたいです。
下記にサンプルコードを記載します。

package ren01;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class read02 {

    public static void main(String[] args) {
        // ここにコードを挿入
        try {
            // ファイルのパスを指定してオブジェクトを生成。
            File file = new File("C:\\ws01\\ren01\\src\\ren01\\sample.csv");
            // 入力ストリームを生成。( FileNotFoundException が発生 )
            FileInputStream input = new FileInputStream(file);
            /* 入力ストリームの読み込み。 ( UnsupportedEncodingException が発生 )
             * ここでCSVファイルの文字コードを設定しないと文字化けします。 */
            // 読み込むファイルの文字コード(SJIS)
            InputStreamReader stream = new InputStreamReader(input, "SJIS");
            // バッファに取り込み。
            BufferedReader buffer = new BufferedReader(stream);

            String line;

            /* readLine()でバッファの1行を取り出す作業を、読み込める行が無くなるまでwhile文で実行。
             * line = buffer.readline() でBufferedReaderが保持する一行を取出しているので、ループする毎に書き変わります。 */
            while((line = buffer.readLine()) != null) {
                // 取出した1行の文字セットを変換して新たに文字列を生成。
                byte[] b = line.getBytes();
                // String で UnsupportedEncodingException が発生 (変換したい文字コード:UTF-8)
                line = new String(b, "UTF-8");
                // 文字列をカンマ区切りで配列に分けて要素ごとに出力。
                // 16行目、line.splitの第2引数に"-1"を指定しないと、" 3,test, " の行の配列は " 3,test " の2つになってしまい他の行と要素数が
                // 違うため、出力結果の様にはなりません。
                String[] columns = line.split(",", -1);

                for(int j = 0; j < columns.length; j++) {
                    System.out.println(j + " : " + columns[j]);
                }

                System.out.println("");

            }

            // 開いたストリームとバッファを閉じて関連するシステム・リソースを解放します。 ( IOException が発生 )
            input.close();
            stream.close();
            buffer.close();

        } catch (UnsupportedEncodingException | FileNotFoundException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();

        }

    }
}


宜しくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+3

他の回答で「正規表現を使う」のアイデアに合意します。

String.matches()は今回のケースでは性能が良くないので、
java.util.regexのPatternとMatcherを使うのをおすすめします。
以下、正規表現の使用例です。

Pattern p1 = Pattern.compile("^[0-9]+$"); // 数字
Pattern p2 = Pattern.compile("^[0-9]{3}-[0-9]{4}-[0-9]{4}$") // 携帯番号
  :
for(int j = 0; j < columns.length; j++) {
    System.out.println(j + " : " + columns[j]);
    if(j==2 && p1.matcher(columns[j]).matches()==false){
        System.out.println("任意番号がおかしい: "+column[j]);
    }else if(j==3 && p2.matcher(columns[j]).matches()==false){
        System.out.println("携帯番号がおかしい: "+column[j]);
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/15 17:25

    Pattern.compile("^[0-9a-zA-Z]+$") //社員番号(英数字文字のみが1文字以上)

    - []の中: 文字範囲
    - []の後が* : 0文字以上
    - []の後が+ : 1文字以上
    - []の後が{3} : 3文字
    - []の後が{3,5} : 3~5文字

    という意味です。

    キャンセル

  • 2016/06/16 09:29

    横から失礼します。
    String.matches()の性能は遅いんですね^^;
    勉強になりました。ありがとうございます。

    キャンセル

  • 2016/06/19 10:03

    String.matches()は内部で、PatternとMatherを使います。

    したがって、1回だけのマッチングであれば、String.matches()でもオッケーです。
    今回は何回もマッチングを行いますので、あらかじめPatternインスタンスを生成しておいたほうが性能が良いのです。

    キャンセル

0

String[] columns = line.split(",", -1);

で1カラムずつ値をとった後に、該当するインデクスの値をチェックすればいいと思います。

・任意番号が整数型(int)かのチェック
・携帯番号に(-)が含まれているかのチェック
→ java.lang.String#matches(String)
引数に正規表現を渡してあげればいいかと。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

整数型かどうかを調べるならInteger#parseIntを使ってエラーかどうかで判断できます。

try {
    Integer.parseInt(columns[2]);
}
catch(Exception e) {
    // 整数に変換できない
}

0~9の数字だけが使われているかは正規表現を使うことで調べることができます。

Pattern numPattern = Pattern.compile("^[0-9]+$");
Matcher m = numPattern.match(columns[2]);
if(m.find()) {
    // 数字だけ
}
else {
    // 数字以外を含む
}


「-」が使われているかどうかは単純にString#indexOfで調べるとよいでしょう。

if(columns[3].indexOf("-") == -1) {
    // 含まない
}
else {
    // 含む
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/15 11:42 編集

    indexOf("-")だと、ループするか2回実行するかしないと
    "-"が1つしかない場合には対応しきれないですね。

    キャンセル

  • 2016/06/15 11:45

    1個見つかれば「含まれている」に該当するかなと省略してしまいました。確かに携帯番号のフォーマット通りかどうかをチェックするなら正規表現を使うべきでしょうね。

    キャンセル

0

「任意番号が整数型(int)かのチェック」については下記が参考になると思います。

あえて言うほどではない 数値変換時の型チェック Java編  

それと「携帯番号に(-)が含まれている 
かのチェック」については、単純に正規表現を使ったのではダメですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる