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

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

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

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

Q&A

解決済

2回答

12182閲覧

JAVAでCSVファイルの重複チェックについて

kumakumatan

総合スコア213

Java

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

0グッド

0クリップ

投稿2016/06/15 07:10

CSVファイル内容
社員番号(ABC1582),社員名(漢字), 任意番号(124566),携帯番号(xxx-xxxx-xxxx)
配列にデータをセットして、重複している項目を表示させたく思います。
重複チェックで引っかかったものを例えば、「2行目と29行目の社員番号(値)が重複しています」と表示させたく思います。全ての列(A~D列)でチェックをしたく思います。
どのようにしたらいいでしょうか。
下記に途中まで作成したコードを記載します。
宜しくお願い致します。

JAVA

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

1-社員クラスを作る、社員クラスは行番号,社員番号,社員名,任意番号,携帯番号のフィールドを持つ。
2-CSVを社員クラスのリストに変換
3-変換するタイミングで各項目の値をチェックする。。
4-出来上がった社員リストに対して重複
チェックをする。

投稿2016/06/15 08:18

yona

総合スコア18155

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

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

kumakumatan

2016/06/16 04:30

各チェック項目をクラス化して、インスタンス化して、クラスを呼び出すようにしようと思います。 「4-出来上がった社員リストに対して重複」の所がどうしたらいいか悩んでいます。 「読み込み行数とそれに伴う配列までは表示」することができました。 ここから先の項目名(列)に対しての重複チェックをして表示するところができなくて悩んでいます。下記にソースコードを記載しますので、ご教授いただければと思います。 =========JAVAコード=========================== 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 Distinct01 { //処理フラグ(0なら正常:1以上なら異常) int flg = 0; public static void main(String[] args) { // クラス化 //public void method() { // ここにコードを挿入 try { //String path = new File(".").getAbsoluteFile().getParent(); //System.out.println(path + "\\sample.csv"); //String path2 = (path + "\\sample.csv"); //System.out.println(path2); // ファイルのパスを指定してオブジェクトを生成。 File file = new File("C:\\ws01\\ren01\\src\\ren01\\sample.csv"); //File file = new File(path2); // 入力ストリームを生成。( FileNotFoundException が発生 ) FileInputStream input = new FileInputStream(file); /* 入力ストリームの読み込み。 ( UnsupportedEncodingException が発生 ) * ここでCSVファイルの文字コードを設定しないと文字化けします。 */ // 読み込むファイルの文字コード(SJIS) InputStreamReader stream = new InputStreamReader(input, "SJIS"); // バッファに取り込み。 BufferedReader buffer = new BufferedReader(stream); //変数定義 //読み込み行 String line; //読み込み件数 int count = 0; //配列数 //int len1 = 0; /* 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"); // 文字列をカンマ区切りで配列に分けて要素ごとに出力。 // line.splitの第2引数に"-1"を指定しないと、他の行と要素数が // 違うため、出力結果の様にはなりません。 String[] columns = line.split(",", -1); // 読み込み行数カウント count++; //配列数定義 //len1 = columns.length; //System.out.println(len1); for(int j = 0; j < columns.length; j++) { //for(int j = 0; j < 4; j++) { //System.out.println(j + " : " + columns[j]); System.out.println(count + "行目 : " + "配列番号:" + j + ":" + columns[j]); } System.out.println(""); } //配列数表示 //System.out.println(len1); //処理フラグ確認 //System.out.println(flg); // 開いたストリームとバッファを閉じて関連するシステム・リソースを解放します。 ( IOException が発生 ) input.close(); stream.close(); buffer.close(); } catch (UnsupportedEncodingException | FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ==========================================
yona

2016/06/16 04:45

チェックをするたびにCSVを全て読み込むつもりですか?無駄が多いですね。 クラスにするのは社員だと思いますよ。 チェック処理をクラス化するのは良いことですが、渡すのは社員のリストにすべきだと思いますよ。 また、「これから先の項目名」に対して、重複チェックを行うことは不可能です。先にCSVを全て読み込むしかありません。
kumakumatan

2016/06/16 06:19

具体的にどうするかご教授いただけないでしょうか? お願い致します。
yona

2016/06/16 06:21

回答の通りです。
guest

0

各項目と行番号のリストをセットにしたHashMapを使ってみては?

java

1//こんな感じのMapを各項目について作成する 2Map<String, List<Integer>> map = new HashMap<>(); 3 4//仮に名前についてやってみる(実際はループで処理?) 5String name; //名前 6int i; //行番号 7 8List<Integer> list = map.get(name); 9if(list == null) { 10 list = new ArrayList<>(); 11 map.put(name, list); 12} 13list.add(i); 14//この後、mapについてループし、Listのサイズが2以上になっているものが重複と判定できる

投稿2016/06/17 00:46

swordone

総合スコア20649

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問