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

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

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

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

Q&A

解決済

2回答

6944閲覧

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

kumakumatan

総合スコア213

Java

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

0グッド

0クリップ

投稿2016/06/20 07:57

csvファイル(c:\sample)

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

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

java(メイン処理)

1public class exec01 { 2 3 public static void main(String[] args) { 4 5 // FieldChkクラスをインスタンス化する 6 FieldChk Chk = new FieldChk("C:\\sample.csv"); 7 8 // ファイル読み込みメソッドの実施 9 Chk.read(); 10 11 //ファイル読み込み件数の表示 12 System.out.println(Chk.readcount); 13 14 // チェック 15 if(Chk.check1() == true) { 16 System.out.println("正常処理!!"); 17 } 18 19 } 20 21} 22

java(FReadクラス)

1package csvCheck; 2 3/* 4 * ファイル読み込みクラス(文字コードSJIS) 5 */ 6 7import java.io.BufferedReader; 8import java.io.FileInputStream; 9import java.io.IOException; 10import java.io.InputStreamReader; 11import java.util.ArrayList; 12import java.util.List; 13 14public class FRead { 15 public static String[] getLines(String fileName) { 16 17 18 List<String> list = new ArrayList<String>(); 19 20 BufferedReader br = null; 21 try { 22 /* 入力ストリームの読み込み。 23 * ここでCSVファイルの文字コードを設定しないと文字化けします。 24 * 読み込むファイルの文字コード(SJIS) */ 25 br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "SJIS")); 26 27 String line = null; 28 // ファイル読み込み 29 while((line = br.readLine()) != null) { 30 list.add(line); 31 32 } 33 34 // br.close(); 35 36 } catch (IOException err) { 37 err.printStackTrace(); 38 } finally { 39 if(br != null) { 40 try { 41 br.close(); 42 } catch (IOException ex) { 43 // Do nothing 44 } 45 } 46 } 47 48 return list.toArray(new String[0]); 49 50 } 51} 52

java(FieldChkクラス)

1package csvCheck; 2 3import java.util.regex.Pattern; 4 5public class FieldChk { 6 7 // private ファイル名; 8 private String fname; 9 // private 読み込みバッファ; 10 String[] csv; 11 12 //csv読み込み件数 13 int readcount = 0; 14 15 /* コンストラクタ(引数){ 16 * 引数をファイル名に保持 17 * } */ 18 19 public FieldChk(String fname) { 20 this.fname = fname; 21 22 } 23 24 public FieldChk(int readcount) { 25 this.readcount = readcount; 26 27 } 28 29 public void read() { 30 //FReadクラスでファイルを読み込んで、読み込みバッファに格納 31 csv = FRead.getLines(fname); 32 33 } 34 35 public boolean check1() { 36 // 読み込みバッファを使ってチェック1処理 37 // 「FieldChk01」の処理 38 String line; 39 40 //読み込み行数 41 int readcount = 0; 42 43 int count = 0; 44 for(count = 0; count < csv.length; count++) { 45 46 line = csv[count]; 47 String[] columns = line.split(",", -1); 48 49 readcount++; 50 51 Pattern p1 = Pattern.compile("^[0-9]+$"); // 番号 52 Pattern p2 = Pattern.compile("^[0-9]{3}-[0-9]{4}-[0-9]{4}$"); // 携帯番号 53 //Pattern p3 = Pattern.compile("^[a-zA-Z]{3}[0-9]{4}$"); //社員番号(英数字) 54 // 数字が含まれていればOK(社員番号) 55 Pattern p3 = Pattern.compile("^[0-9a-zA-Z]+$"); //社員番号(英数字文字のみが1文字以上) 56 Pattern p4 = Pattern.compile("^[^\\d]+$"); // 簡単な正規表現(単純に数字が含まれていないというのを確認) 57 58 for(int j = 0; j < columns.length; j++) { 59 60 //データ型チェック開始 61 if(j == 0 && p3.matcher(columns[j]).matches() == false) { 62 System.out.println(readcount + "行目の" + "【1列目】入力規則違反。【入力値: " + columns[j] + "】"); 63 return false; 64 } else if(j == 1 && p4.matcher(columns[j]).matches() == false) { 65 //if(j == 1 && p4.matcher(columns[j]).matches() == false) { 66 System.out.println(readcount + "行目の" + "【2列目】入力規則違反。【入力値: " + columns[j] + "】"); 67 return false; 68 } else if(j == 2 && p1.matcher(columns[j]).matches() == false) { 69 System.out.println(readcount + "行目の" + "【3列目】入力規則違反。【入力値: " + columns[j] + "】"); 70 return false; 71 } else if(j == 3 && p2.matcher(columns[j]).matches() == false) { 72 System.out.println(readcount + "行目の" + "【4列目】入力規則違反。【入力値: " + columns[j] + "】"); 73 return false; 74 } 75 76 } 77 78 } 79 //System.out.println(readcount); 80 return true; 81 } 82 83}

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

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

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

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

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

coco_bauer

2016/06/20 08:56

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

回答2

0

ベストアンサー

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

java

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

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

Java

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

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

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

投稿2016/06/20 08:30

ttyp03

総合スコア16998

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

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

kumakumatan

2016/06/21 01:19

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

0

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

投稿2016/06/20 08:27

dsuzuki

総合スコア1682

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問