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

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

ただいまの
回答率

90.46%

  • Java

    16235questions

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

別クラスの変数を呼び出す方法について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,744

kumakumatan

score 142

ABC123,テスト A,123456,060-5938-1234,
ABC456,テスト B,1234567,060-7886-567,
ABC789,テスト C,1234568,060-3981-8910,
ABCD123,テスト D,123459,060-6487-8911,
ABCD456,テスト E,123459,060-4697-8912,テスト
ABCD789,テスト F,1234581,060-4577-8913,
ABCD12,テスト G,1234582,060-1266-8914,
ABCD34,テスト H,12345834,060-7412-8915,

` があります。 このCSVファイルを読み込んで、データ型のチェックをしたく 考えております。誤りがある場合はメッセージ表示する (1列目:英数字のみ/2列目:文字列型/3列目:数値型/4列目:電話番号)ようにしています。 CSVファイルの読み込み件数をメイン処理で表示したく思います。 現在だと「Chk.readcount」= 0となってしまいます。 どこに何を追記、変更したらいいかをご教授いただきたく思います。

public class exec01 {

    public static void main(String[] args) {

        // FieldChkクラスをインスタンス化する
        FieldChk Chk = new FieldChk("C:\\sample.csv");

        // ファイル読み込みメソッドの実施
        Chk.read();

        //ファイル読み込み件数の表示
        System.out.println(Chk.readcount);

        // チェック
        if(Chk.check1() == true) {
            System.out.println("正常処理!!");
        }

    }

}

`

package csvCheck;

/*
 * ファイル読み込みクラス(文字コードSJIS)
 */

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class FRead {
    public static String[] getLines(String fileName) {


        List<String> list = new ArrayList<String>();

        BufferedReader br = null;
        try {
            /* 入力ストリームの読み込み。
             * ここでCSVファイルの文字コードを設定しないと文字化けします。
             * 読み込むファイルの文字コード(SJIS) */
            br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "SJIS"));

            String line = null;
            // ファイル読み込み
            while((line = br.readLine()) != null) {
                list.add(line);

            }

            // br.close();

        } catch (IOException err) {
            err.printStackTrace();
        } finally {
            if(br != null) {
                try {
                    br.close();
                } catch (IOException ex) {
                    // Do nothing
                }
            }
        }

        return list.toArray(new String[0]);

    }
}

`

package csvCheck;

import java.util.regex.Pattern;

public class FieldChk {

    // private ファイル名;
    private String fname;
    // private 読み込みバッファ;
    String[] csv;

    //csv読み込み件数
    int readcount = 0;

    /* コンストラクタ(引数){
     * 引数をファイル名に保持
     * } */

    public FieldChk(String fname) {
        this.fname = fname;

    }

    public FieldChk(int readcount) {
        this.readcount = readcount;

    }

    public void read() {
        //FReadクラスでファイルを読み込んで、読み込みバッファに格納
        csv = FRead.getLines(fname);

    }

    public boolean check1() {
        // 読み込みバッファを使ってチェック1処理
        // 「FieldChk01」の処理
        String line;

        //読み込み行数
        int readcount = 0;

        int count = 0;
        for(count = 0; count < csv.length; count++) {

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

            readcount++;

            Pattern p1 = Pattern.compile("^[0-9]+$"); // 番号
            Pattern p2 = Pattern.compile("^[0-9]{3}-[0-9]{4}-[0-9]{4}$"); // 携帯番号
            //Pattern p3 = Pattern.compile("^[a-zA-Z]{3}[0-9]{4}$"); //社員番号(英数字)
            // 数字が含まれていればOK(社員番号)
            Pattern p3 = Pattern.compile("^[0-9a-zA-Z]+$"); //社員番号(英数字文字のみが1文字以上)
            Pattern p4 = Pattern.compile("^[^\\d]+$"); // 簡単な正規表現(単純に数字が含まれていないというのを確認)

            for(int j = 0; j < columns.length; j++) {

                //データ型チェック開始
                if(j == 0 && p3.matcher(columns[j]).matches() == false) {
                    System.out.println(readcount + "行目の" + "【1列目】入力規則違反。【入力値: " + columns[j] + "】");
                    return false;
                } else if(j == 1 && p4.matcher(columns[j]).matches() == false) {
                    //if(j == 1 && p4.matcher(columns[j]).matches() == false) {
                    System.out.println(readcount + "行目の" + "【2列目】入力規則違反。【入力値: " + columns[j] + "】");
                    return false;
                } else if(j == 2 && p1.matcher(columns[j]).matches() == false) {
                    System.out.println(readcount + "行目の" + "【3列目】入力規則違反。【入力値: " + columns[j] + "】");
                    return false;
                } else if(j == 3 && p2.matcher(columns[j]).matches() == false) {
                    System.out.println(readcount + "行目の" + "【4列目】入力規則違反。【入力値: " + columns[j] + "】");
                    return false;
                }

            }

        }
        //System.out.println(readcount);
        return true;
    }

}

`

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • coco_bauer

    2016/06/20 17:56

    Chk.read(); は、ファイルからデータを読んで Chk.csvに入れるだけです。Chk.readcountは変更されないので0と表示されます。 FieldChk(int readcount)というコンストラクタがありますが、readcountは「ファイルから読みだす行数を事前に設定する」ための変数なのでしょうか、それとも「ファイルから全部読みだした結果の行数を記録する」ためのものなのでしょうか?コンストラクタは前者を、質問の内容は後者を想定しているようで一貫性がありません。

    キャンセル

回答 2

checkベストアンサー

0

前回の最後の方の回答を参考にしていただければと思いますが。
readメソッド後、読み込んだデータはcsvに入っています。
csv.length で配列の要素数が取得できます。
要素数を返却するメソッドを用意し、要素数を返却します。

public int getCount() {
    return csv.length;
}


mainからはこのメソッドを呼べばOKです。

System.out.println(Chk.getCount());

現状のソースでreadcountが0になることについても説明しておきます。
原因はコンストラクタで数値を指定したときにしか値をセットしていないからです。
もしcsv.lengthではなく、変数にデータ数を入れたいというのであれば、readメソッドの最後に、
readcount = csv.length;
とすればOKです。
但し、readcount変数をmainから直接参照するのはよろしくありません。
getCount()のようなメソッド経由で参照するのが望ましいです。

余談ですが、readcountという変数が、クラス内とメソッド内にあり紛らわしくバグの原因になるので、別名にした方が良いですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/21 10:19

    ありがとうございました。
    解決できました。

    キャンセル

0

メソッドcheck1()内でreadcountを変更するなら、System.out.println(Chk.readcount);はそれよりも後にする必要があります。
件数表示の後に成否を表示したいなら、メソッドcheck1()の結果をローカル変数で保持し、件数表示後にローカル変数をif文で判定すればいいのではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Java

    16235questions

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