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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

4278閲覧

【C#】 配列に格納された各文字列の一部分を重複チェックと処理について

Takayukky

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/02/25 17:24

プログラミング初心者の者です。
自分では実装ができない処理があったため質問させていただきました。

現在C#で、エクセルファイルを読み込ませ、内容をデータベースに登録させるプログラムを書いています。エクセルファイルの中身は、1行ごとに[名前,性別,生年月日]を入力する表になっています。

ファイルを読み込ませるときに、各列の入力値の検証を行っており、もし不正な値が入力されていた場合は、

[【i】行目:【項目名】の値が不正です]

のような行番号を明示したエラーメッセージを配列に格納するようにしています。

最終的にその配列の中身はログとして出力するのですが、以下のように表示される場合があり、改善したいと考えています。

<Error Log> 3行目:名前の値が不正です 3行目:性別の値が不正です 3行目:生年月日が不正です 4行目:性別の値が不正です . . .

上記の場合、以下のように重複する先頭4文字を削除して表示させたいと考えいます。

<Error Log> 3行目:名前の値が不正です 性別の値が不正です 生年月日が不正です 4行目:性別の値が不正です . . .

私が解決できず困っている点は、
①先頭4文字を対象とした重複チェック処理
②重複する値の削除
③その処理を行うタイミングは、エラーメッセージ格納時か?それともログ出力時か?
以上の3点です。

この3つの問題を解決する方法を、
または何かしらのヒントでも構いません。教えていただけないでしょうか?
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ご質問の前提をひっくり返すようで申し訳ないのですが、「改善前」のログの方が良いログです。
「改善」したログは

  • 一行読んだだけではそのラインの意味を理解できません。前方へ辿って行番号を探す必要があります。
  • 行番号を含むラインとそうでないラインで書式が違うわけで、自動的な処理に向きません。

ログというのは一般的にテキストエディタで読むと限られたものではなく、スクリプトで処理したりExcelに読み込んで分析したりするものです。そのとき、上記の2点は大きな足かせになります。

投稿2016/02/25 17:39

yuba

総合スコア5568

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

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

Takayukky

2016/02/25 23:18

ご回答ありがとうございます。 ログを扱っていくにあたり、yubaさんのおっしゃる2点は考慮しなくてはいけないと気づきました。 このような回答も非常にありがたいです。勉強になります! ありがとうございます!
guest

0

ベストアンサー

ログを出力するプログラムを変更することが可能であれば、重複をあとから削除するのではなく出力時にそれを考慮して出力する方が簡単で確実です。たとえば次のようなクラスを出力する例では LINQ を使って書くことが出来ます。

実行してみた結果も合わせてどうぞ: http://ideone.com/XJh6Qo

lang

1using System; 2using System.Linq; 3using System.Collections.Generic; 4 5class ErrorLog 6{ 7 public int Line { get; set; } 8 public string Message { get; set; } 9 10 public ErrorLog(int line, string message) 11 { 12 this.Line = line; 13 this.Message = message; 14 } 15} 16 17class Logger 18{ 19 public static void Write(IEnumerable<ErrorLog> logs) 20 { 21 string output = string.Join("\n", logs.GroupBy(x => x.Line) 22 .Select(x => x.Key + "行目:" + string.Join("\n", x.Select(y => y.Message)))); 23 24 Console.WriteLine(output); 25 } 26} 27 28public class Test 29{ 30 public static void Main() 31 { 32 var logs = new[] 33 { 34 new ErrorLog(3, "名前の値が不正です"), 35 new ErrorLog(3, "性別の値が不正です"), 36 new ErrorLog(3, "生年月日が不正です"), 37 new ErrorLog(4, "性別の値が不正です"), 38 }; 39 Logger.Write(logs); 40 } 41}

投稿2016/02/25 17:49

chitoku

総合スコア1610

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

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

Takayukky

2016/02/25 23:26

ソースと実行結果をあわせてご回答いただきありがとうございます。 出力時に処理したほうが良いのですね。Linqでは単純な操作しかしたことがなかったので、ご提供していただいたソースで勉強させていただきます。 非常に助かりました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問