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

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

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

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

Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

3回答

26174閲覧

javaによるcsv入力データのチェック処理について

kumakumatan

総合スコア213

CSV

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

Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

1クリップ

投稿2016/06/17 07:55

編集2016/06/17 08:00

CSVファイル(C:\sample)

1ABC123,テスト A,123456,060-5938-1234, 2ABfD456,テスト E,123459,060-4697-8912,テスト 3ABCD789,テスト F,1234581,060-4577-8913, 4ABCD12,テスト G,1234582,060-1266-8914, 5ABCD34,テスト H,12345834,060-7412-8915,

のCSVファイルの入力データチェックプログラムを作成しています。
やりたい事はできたのですが、プログラムの書き方(無駄なところ)
などをチェックしていただきたく思います。
■CSVチェックプログラム項目
(1)A~D列以外(1~4列)に入力がある場合メッセージ表示
(2)入力値に誤りがある場合、メッセージ表示(1列目:英数字のみ/2列目:文字列型/3列目:数値型/4列目:電話番号)
(3)各列(A~D列)に重複値がある場合は、メッセージ表示
(1)~(3)まですべてクリアしたら、「正常終了のメッセージ」を表示

下記に作成したプログラムを記述します。

java

1package csvRead; 2 3public class exec01 { 4 5 public static void main(String[] args) { 6 7 FieldChk01 Chk01 = new FieldChk01(); 8 9 Chk01.method(); 10 11 FieldChk02 Chk02 = new FieldChk02(); 12 13 Chk02.method(); 14 15 16 FReadDistinct Chk03 = new FReadDistinct(); 17 18 19 Chk03.method(); 20 21 22 if(Chk01.flg == 0 && FieldChk02.flg == 0 && Chk03.flg2 == 0) { 23 System.out.println("正常処理!!"); 24 } 25 26 } 27 28}

JAVA

1/** 2 * CSV入力値(A列~D列)のチェック 3 * @param args 4 */ 5 6package csvRead; 7 8import java.io.BufferedReader; 9import java.io.File; 10import java.io.FileInputStream; 11import java.io.FileNotFoundException; 12import java.io.IOException; 13import java.io.InputStreamReader; 14import java.io.UnsupportedEncodingException; 15import java.util.regex.Pattern; 16 17public class FieldChk01 { 18 //処理フラグ(0なら正常:1以上なら異常) 19 int flg = 0; 20 21 public void method() { 22 23 24 try { 25 26 File file = new File("C:\\sample.csv"); 27 28 // 入力ストリームを生成。( FileNotFoundException が発生 ) 29 FileInputStream input = new FileInputStream(file); 30 /* 入力ストリームの読み込み。 ( UnsupportedEncodingException が発生 ) 31 * ここでCSVファイルの文字コードを設定しないと文字化けします。 */ 32 // 読み込むファイルの文字コード(SJIS) 33 InputStreamReader stream = new InputStreamReader(input, "SJIS"); 34 // バッファに取り込み。 35 36 BufferedReader buffer = new BufferedReader(stream); 37 38 39 String line; 40 //読み込み件数 41 int count = 0; 42 //配列数 43 //int len1 = 0; 44 45 /* readLine()でバッファの1行を取り出す作業を、読み込める行が無くなるまでwhile文で実行。 46 * line = buffer.readline() でBufferedReaderが保持する一行を取出しているので、ループする毎に書き変わります。 */ 47 while((line = buffer.readLine()) != null) { 48 // 取出した1行の文字セットを変換して新たに文字列を生成。 49 byte[] b = line.getBytes(); 50 // String で UnsupportedEncodingException が発生 (変換したい文字コード:UTF-8) 51 line = new String(b, "UTF-8"); 52 // 文字列をカンマ区切りで配列に分けて要素ごとに出力。 53 // line.splitの第2引数に"-1"を指定しないと、他の行と要素数が 54 // 違うため、出力結果の様にはなりません。 55 String[] columns = line.split(",", -1); 56 57 // 読み込み行数カウント 58 count++; 59 60 61 Pattern p1 = Pattern.compile("^[0-9]+$"); // 番号 62 Pattern p2 = Pattern.compile("^[0-9]{3}-[0-9]{4}-[0-9]{4}$"); // 電話番号 63 // 数字が含まれていればOK(社員番号) 64 Pattern p3 = Pattern.compile("^[0-9a-zA-Z]+$"); //社員番号(英数字文字のみが1文字以上) 65 Pattern p4 = Pattern.compile("^[^\\d]+$"); // 簡単な正規表現(単純に数字が含まれていないというのを確認) 66 67 for(int j = 0; j < columns.length; j++) { 68 //for(int j = 0; j < 4; j++) { 69 //System.out.println(j + " : " + columns[j]); 70 71 //データ型チェック開始 72 if(j == 0 && p3.matcher(columns[j]).matches() == false) { 73 System.out.println(count + "行目の" + "【1列目】入力規則違反。【入力値: " + columns[j] + "】"); 74 flg++; 75 } else if(j == 1 && p4.matcher(columns[j]).matches() == false) { 76 //if(j == 1 && p4.matcher(columns[j]).matches() == false) { 77 System.out.println(count + "行目の" + "【2列目】入力規則違反。【入力値: " + columns[j] + "】"); 78 flg++; 79 } else if(j == 2 && p1.matcher(columns[j]).matches() == false) { 80 System.out.println(count + "行目の" + "【3列目】入力規則違反。【入力値: " + columns[j] + "】"); 81 flg++; 82 } else if(j == 3 && p2.matcher(columns[j]).matches() == false) { 83 System.out.println(count + "行目の" + "【4列目】入力規則違反。【入力値: " + columns[j] + "】"); 84 flg++; 85 } 86 87 //データ型チェック終了 88 } 89 90 } 91 92 93 // 開いたストリームとバッファを閉じて関連するシステム・リソースを解放します。 ( IOException が発生 ) 94 input.close(); 95 stream.close(); 96 buffer.close(); 97 98 } catch (UnsupportedEncodingException | FileNotFoundException e) { 99 e.printStackTrace(); 100 101 } catch (IOException e) { 102 e.printStackTrace(); 103 104 } 105 106 } 107 108}

java

1/** 2 * CSV配列数のチェック(A~D列以外はNG) 3 * @param args 4 */ 5 6package csvRead; 7 8import java.io.BufferedReader; 9import java.io.File; 10import java.io.FileInputStream; 11import java.io.FileNotFoundException; 12import java.io.IOException; 13import java.io.InputStreamReader; 14import java.io.UnsupportedEncodingException; 15 16public class FieldChk02 { 17 //処理フラグ(0なら正常:1以上なら異常) 18 static int flg = 0; 19 20 //public static void main(String[] args) { 21 // クラス化 22 public void method() { 23 // ここにコードを挿入 24 25 try { 26 27 // ファイルのパスを指定してオブジェクトを生成。 28 File file = new File("C:\\sample.csv"); 29 //File file = new File(path2); 30 31 // 入力ストリームを生成。( FileNotFoundException が発生 ) 32 FileInputStream input = new FileInputStream(file); 33 /* 入力ストリームの読み込み。 ( UnsupportedEncodingException が発生 ) 34 * ここでCSVファイルの文字コードを設定しないと文字化けします。 */ 35 // 読み込むファイルの文字コード(SJIS) 36 InputStreamReader stream = new InputStreamReader(input, "SJIS"); 37 // バッファに取り込み。 38 39 BufferedReader buffer = new BufferedReader(stream); 40 41 String line; 42 //読み込み件数 43 int count = 0; 44 //配列数 45 int len1 = 0; 46 47 /* readLine()でバッファの1行を取り出す作業を、読み込める行が無くなるまでwhile文で実行。 48 * line = buffer.readline() でBufferedReaderが保持する一行を取出しているので、ループする毎に書き変わります。 */ 49 while((line = buffer.readLine()) != null) { 50 // 取出した1行の文字セットを変換して新たに文字列を生成。 51 byte[] b = line.getBytes(); 52 // String で UnsupportedEncodingException が発生 (変換したい文字コード:UTF-8) 53 line = new String(b, "UTF-8"); 54 // 文字列をカンマ区切りで配列に分けて要素ごとに出力。 55 // line.splitの第2引数に"-1"を指定しないと、他の行と要素数が 56 // 違うため、出力結果の様にはなりません。 57 String[] columns = line.split(",", 0); 58 59 // 読み込み行数カウント 60 count++; 61 //配列数定義 62 len1 = columns.length; 63 64 for(int j = 0; j < columns.length; j++) { 65 //for(int j = 0; j < 4; j++) { 66 //System.out.println(j + " : " + columns[j]); 67 68 } 69 //配列数オーバーの行表示 70 if(len1 > 4) { 71 System.out.println(count + "行目の" + len1 + "列目に不正入力データがあります。"); 72 flg++; 73 74 } 75 76 } 77 78 79 80 // 開いたストリームとバッファを閉じて関連するシステム・リソースを解放します。 ( IOException が発生 ) 81 input.close(); 82 stream.close(); 83 buffer.close(); 84 85 } catch (UnsupportedEncodingException | FileNotFoundException e) { 86 e.printStackTrace(); 87 88 } catch (IOException e) { 89 e.printStackTrace(); 90 91 } 92 93 } 94 95}

java

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

JAVA

1package csvRead; 2/* 3 * ファイル重複データ項目の表示 4 */ 5 6import java.util.ArrayList; 7import java.util.HashSet; 8import java.util.List; 9import java.util.Set; 10 11public class FReadDistinct { 12 //処理フラグ(0なら正常:1以上なら異常) 13 int flg2 = 0; 14 15 //public static void main(String[] args) { 16 // クラス化 17 public void method() { 18 19 String[] csv = FRead.getLines("C:\\sample.csv"); 20 21 List<String> result1 = new ArrayList<String>(); 22 List<String> result2 = new ArrayList<String>(); 23 List<String> result3 = new ArrayList<String>(); 24 List<String> result4 = new ArrayList<String>(); 25 26 for(String line : csv) { 27 result1.add(line.split(",")[0]); 28 result2.add(line.split(",")[1]); 29 result3.add(line.split(",")[2]); 30 result4.add(line.split(",")[3]); 31 } 32 33 // 重複チェックオブジェクト 34 Set<String> set1 = new HashSet<String>(); 35 Set<String> set2 = new HashSet<String>(); 36 Set<String> set3 = new HashSet<String>(); 37 Set<String> set4 = new HashSet<String>(); 38 39 //社員番号列(A列) 40 for(String user1 : result1) { 41 //setに追加してみて、追加できなかった(重複していた)場合 42 if(!set1.add(user1)) { 43 System.out.println("【社員番号】に重複データがあります。値:" + user1); 44 flg2++; 45 46 } 47 } 48 49 //社員名列(B列) 50 for(String user2 : result2) { 51 //setに追加してみて、追加できなかった(重複していた)場合 52 if(!set2.add(user2)) { 53 System.out.println("【社員名】に重複データがあります。値:" + user2); 54 flg2++; 55 56 } 57 } 58 59 //内線番号列(C列) 60 for(String user3 : result3) { 61 //setに追加してみて、追加できなかった(重複していた)場合 62 if(!set3.add(user3)) { 63 System.out.println("【番号】に重複データがあります。値:" + user3); 64 flg2++; 65 66 } 67 } 68 69 //電話番号列(D列) 70 for(String user4 : result4) { 71 //setに追加してみて、追加できなかった(重複していた)場合 72 if(!set4.add(user4)) { 73 System.out.println("【電話番号】に重複データがあります。値:" + user4); 74 flg2++; 75 76 } 77 } 78 79 } 80 81} 82``` 83宜しくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

FieldChk01クラス、FieldChk02クラス、FReadDistinctクラス、それぞれでファイルの読み込み処理を行っているのが無駄かと思います。
クラスは1つにして、コンストラクタでファイル名を渡す。
コンストラクタか読み込み用のメソッドを作って、ファイルを読み込む。
チェック用のメソッドを3つ用意する。
各メソッドでは読み込み済みのデータでチェック処理をして、結果を返却する。
このような感じの方がスマートな作り且つオブジェクト指向的な感じになると思います。

メインの方の流れだけ書いてみました。
メソッド名とかは適当です。

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 if(Chk.check1() == 0 && Chk.check2() == 0 && Chk.check3() == 0) { 13 System.out.println("正常処理!!"); 14 } 15 16 } 17}

追記
methodというメソッド名は、処理の内容がわからないのでよろしくないです。

追記2
FieldChkクラスのサンプルです(イメージレベル)

Java

1class FieldChk { 2 private ファイル名; 3 private 読み込みバッファ; 4 コンストラクタ(引数){ 5 引数をファイル名に保持 6 } 7 public read(){ 8 FReadクラスでファイルを読み込んで、読み込みバッファに格納 9 } 10 public boolean check1(){ 11 読み込みバッファを使ってチェック1処理 12 結果を返す(true/false) 13 } 14 public boolean check2(){ 15 読み込みバッファを使ってチェック2処理 16 結果を返す(true/false) 17 } 18 public boolean check3(){ 19 読み込みバッファを使ってチェック3処理 20 結果を返す(true/false) 21 } 22}

check1~3メソッドの戻り値の型をbooleanに変更しました。
ok/ngを判定するメソッドなので、そちらの方がふさわしいかと思います。
なのでmainの方では、次のように判定できます。

Java

1if(Chk.check1() == true && Chk.check2() == true && Chk.check3() == true) { 2 3もしくは 4 5if(Chk.check1() && Chk.check2() && Chk.check3()) {

投稿2016/06/17 08:12

編集2016/06/20 00:27
ttyp03

総合スコア16998

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

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

kumakumatan

2016/06/20 00:05

ご回答ありがとうございます。 (1)クラスは1つにする⇒FieldChk01/FieldChk02/FReadDistinctを1つのクラス「FieldChk」クラスにまとめる   →チェック用のメソッド(入力範囲のチェック(check1)/入力値のチェック(check2)/重複チェック(check3)) (2)FReadクラスでファイルを読む?(コンストラクタか読み込み用のメソッドを作るがあまり理解できません・・・) (3)各メソッドでは読み込み済みのデータをチェック のような処理の流れでしょうか?メイン処理に対しての「入力範囲のチェック(check1)」の書き方を教えて いただけないでしょうか。 宜しくお願いします。
ttyp03

2016/06/20 00:28

流れは上記で良いと思います。 (2)のところは、サンプルで書いたコードの Chk.read(); のところです。readメソッドの中でファイルを読み込むところを指しています。サンプルではコンストラクタでは読んでません。 読み込む処理は、FReadクラスを使っても良いですし、メソッド化しても良いかもですね。 > メイン処理に対しての「入力範囲のチェック(check1)」の書き方を教えて サンプルコードの以下の所です。 if(Chk.check1() == 0 && Chk.check2() == 0 && Chk.check3() == 0) { 追記2でサンプルを追記しておきました。参考まで。
kumakumatan

2016/06/20 01:43

ご回答ありがとうございます。自分なりに作成してみましたが、わからない所だらけです。下記にソースを記載しますので、教えていただけないでしょうか? ````java public class FieldChk { // private ファイル名; private String fname; // private 読み込みバッファ??; 記述方法がわかりません。。 /* コンストラクタ(引数){ * 引数をファイル名に保持 * } */ public FieldChk(String fname) { this.fname = fname; } public read(){ //FReadクラスでファイルを読み込んで、読み込みバッファに格納?? FReadクラス の中身の記述をすればいいでしょうか?? } public boolean check1() { // 読み込みバッファを使ってチェック1処理 読み込みバッファを使ってチェック1処理はどうすればいいでしょうか?? //結果を返す(true/false) どのようにすればいいでしょうか?? } } ```` また、ファイルは「FieldChkクラス」と「exec01クラス」の2つでいいのでしょうか? 宜しくお願いします。
ttyp03

2016/06/20 01:57

> // private 読み込みバッファ??; > 記述方法がわかりません。。 FReadDistinctクラスを流用すればいいかと。 String[] csv; > //FReadクラスでファイルを読み込んで、読み込みバッファに格納?? > FReadクラス の中身の記述をすればいいでしょうか?? 折角Freadクラスがあるので、今回はFReadクラスはそのまま残しましょうか。 なのでここもFReadDistinctクラスの流用してこんな感じでしょうか。 csv = FRead.getLines(fname); > // 読み込みバッファを使ってチェック1処理 > 読み込みバッファを使ってチェック1処理はどうすればいいでしょうか?? methodメソッドでやっている処理を、読み込みバッファcsvに対して行うようにすればよいです。 > //結果を返す(true/false) > どのようにすればいいでしょうか?? return flg == 0;
kumakumatan

2016/06/20 02:18

ご回答ありがとうございます。 >methodメソッドでやっている処理を、読み込みバッファcsvに対して行うようにすれば>よいです。 具体的にはどのようにするのでしょうか? ````java public class FieldChk { // private ファイル名; private String fname; // private 読み込みバッファ; String[] csv; /* コンストラクタ(引数){ * 引数をファイル名に保持 * } */ public FieldChk(String fname) { this.fname = fname; } public void read() { //FReadクラスでファイルを読み込んで、読み込みバッファに格納 //FReadクラス の中身の記述?? csv = FRead.getLines(fname); } public boolean check1() { // 読み込みバッファを使ってチェック1処理 // 読み込みバッファを使ってチェック1処理 // 「FieldChk01」の処理 //結果を返す(true/false) boolean flg = false; return flg == true; } } ```` 宜しくお願いします。
ttyp03

2016/06/20 02:26

そこは自分で考えるところ!と言ってもよいのですが、触りだけ書いておきます。 要はファイル読み込みから、保持しているバッファを参照するように変えれば良いだけだと思います。 String line; int count = 0; for(count = 0; count < csv.length; count++ ){ line = csv[count]; ~ あとflgのところは、既存クラスからの流用のイメージで書きましたので、型はintで良いです。 int flg = 0; これをメソッド内のローカル変数に定義すればよいだけです。
kumakumatan

2016/06/20 05:28

ご回答ありがとうございます。 ````java import java.util.regex.Pattern; public class FieldChk { // private ファイル名; private String fname; // private 読み込みバッファ; String[] csv; /* コンストラクタ(引数){ * 引数をファイル名に保持 * } */ public FieldChk(String fname) { this.fname = fname; } public void read() { //FReadクラスでファイルを読み込んで、読み込みバッファに格納 csv = FRead.getLines(fname); } public boolean check1() { // 読み込みバッファを使ってチェック1処理 // 読み込みバッファを使ってチェック1処理 // 「FieldChk01」の処理 String line; int count = 0; for(count = 0; count < csv.length;) { line = csv[count]; String[] columns = line.split(",", -1); count++; 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++) { //for(int j = 0; j < 4; j++) { //System.out.println(j + " : " + columns[j]); //データ型チェック開始 if(count == 0 && p3.matcher(columns[count]).matches() == false) { System.out.println(count + "行目の" + "【1列目】入力規則違反。【入力値: " + columns[count] + "】"); //flg++; return false; } else if(count == 1 && p4.matcher(columns[count]).matches() == false) { //if(j == 1 && p4.matcher(columns[j]).matches() == false) { System.out.println(count + "行目の" + "【2列目】入力規則違反。【入力値: " + columns[count] + "】"); //flg++; return false; } else if(count == 2 && p1.matcher(columns[count]).matches() == false) { System.out.println(count + "行目の" + "【3列目】入力規則違反。【入力値: " + columns[count] + "】"); //flg++; return false; } else if(count == 3 && p2.matcher(columns[count]).matches() == false) { System.out.println(count + "行目の" + "【4列目】入力規則違反。【入力値: " + columns[count] + "】"); //flg++; return false; } // } //結果を返す(true/false) //int flg = 0; return true; } return false; } } ```` 作成してみたのですが、うまくいきません。。 もう少し教えていただけないでしょうか。 宜しくお願いします。
ttyp03

2016/06/20 05:37

count++; は不要ですね。ループでカウントしているので。 あとは元々ループが二重だったのが一重になってますが大丈夫ですか? こんな感じの構成になれば良いと思います。 読み込みバッファのループ {  カラムのループ {   チェック処理 → エラーで return false;  } } return true;
kumakumatan

2016/06/20 06:02

ご回答ありがとうございます。 まずは、count変数をexec01処理で呼び出してみようと思います。 読み込み行数が何行あるかのチェックです。 FieldChkクラスで、 ````java public int getCount() { return getCount(); } ```` として、exec01クラスで「System.out.println(Chk.getCount());」として、読み込み件数を表示させたいのですが、されません。どこを修正したらいいでしょうか? 宜しくお願いします。
ttyp03

2016/06/20 06:09

return getCount(); では再帰呼び出しになってますよ。 return csv.length; では。 それとあまり細かいデバッグ的なことを依頼されるのは、そもそもの質問の趣旨とかけ離れてしまうのでご遠慮くださいませ。 他の方の回答も合わせて一旦自分なりに再構築して、その上で問題点を改めて質問した方が良いと思いますよ。
kumakumatan

2016/06/20 06:49

ありがとうございます。もう一度考えなおします。
guest

0

ファイルの読み取り処理は一般的に時間がかかります。CSVの容量にもよりますが、一度全てを読み取った方が良いと思いますよ。

・先にCSVを読み取る処理を行い、CSVからStringの配列に変換する。
・各チェッククラスはStringの配列を受け取り、チェックを行う。

また、下記のようなことも考えられます。
・チェッククラスはもう少し具体的な名前にすべきかなとおもいます。
・チェックインターフェースを作成し、チェックメソッドを宣言する。各チェッククラスはチェックインターフェースを実装する。
・チェックメソッドの戻り値はboolean型にし、flgを廃止する。
・boolean型は==で比較しない。

チェックをするだけで具体的にどこが悪いかはわからないので、それがわかるようにするともっと実践的になると思います。

投稿2016/06/17 08:33

yona

総合スコア18155

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

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

0

ttyp03さんがファイル読み込みについて言及しているので、それ以外で気になった点を挙げます。
1.シンプルなカンマ区切りの想定だけでいいのか
→この場合、項目内にカンマが入ってくるとそれさえも分割してしまいます。
2.エラーメッセージの形式が同じならをテンプレート、バインドの考え方を利用してみては?
→共通部分をあらかじめ用意し、可変部分を出力時に指定すれば、メッセージを変更したい時のメンテナンスも楽になります。

投稿2016/06/17 08:29

SeventhBell

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問