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宜しくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/20 00:05
2016/06/20 00:28
2016/06/20 01:43
2016/06/20 01:57
2016/06/20 02:18
2016/06/20 02:26
2016/06/20 05:28
2016/06/20 05:37
2016/06/20 06:02
2016/06/20 06:09
2016/06/20 06:49