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

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

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

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

解決済

CSVの情報をクラスに

YU-N
YU-N

総合スコア4

C#

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

5回答

1評価

1クリップ

565閲覧

投稿2022/05/20 15:41

編集2022/05/30 20:50

プログラミング初心者です。
csvにて受け取った内容を、自作クラスでオブジェクト化したいのですが
プロパティ名が可変する場合、どのようにクラスを作ればよいのでしょうか。

複数のcsvが与えられ
各csvには下記のように情報が入っています。---

項目名1,内容,項目名2,内容,項目名3,内容・・・

例:csv1
場所,東京,取引先,株式会社A,商品,食品・・・

項目名は、決まったものではなく、どんな項目が入ってくるかわかりません。
また項目数も、ファイルによってマチマチです。

項目名の順序もマチマチという場合があります。

例:csv2
実績,あり,商品,食品,取引先,株式会社A,場所,東京,実店舗,あり・・・

これを、例えば"csv1"の”場所”の情報が欲しい時に
csv1.場所

とすれば
東京という値が取れるように
自作のクラスを使ってオブジェクト化したいのですが
具体的なコードを書くことができません。
どのような方法論が良いのか、ヒントだけでも頂けないでしょうか。

尚、”場所”や”取引先”といった項目名は、日本語で入っています。

このような場合に、クラスを使うのは適切ではないのでしょうか。

アドバイス頂ければ幸いです。

宜しくお願い致します。

<追記>
ご指摘を頂きましたので、目的を追記します。
質問の意図は私が思いついた範囲の手段であり
目的は上記にあるような形態のcsvファイルが複数供給され
それをDataGridViewに表示し、DataGridViewの編集結果を保存したい
といったことになります。

VisualStudio2022
言語はC#
WindowsForms
フレームワークは.NET Framework4.7.2
になります。

<05.25追記>
回答者様方のご親切で、当初の質問の意図そのものと少しずれ始めているにも関わらず、会話をさせて頂けております為、質問を整理させてください。

・インプットとなるcsvファイルは複数ファイルです。
・アウトプットしたいcsvファイルは1ファイル(DataGridViewに表示されているイメ―ジの通り)
・DataGridViewに表示したデータに対して、編集する場合があり、編集されたデータをアウトプットしたいです。
・DataGridViewの表示イメージを下記に示します。

イメージ説明

C#

using System; using System.Collections.Generic; using System.Collections; using System.Data; using System.Linq; using System.Windows.Forms; namespace csvtest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //データテーブルを作成 DataTable dt = new DataTable("sample"); //コレクションを作成 var dict_col = new List<Dictionary<string, string>>(); //csvデータを用意(csvの要素が配列になっているとして) string[] csvdata = { "場所", "東京", "取引先", "株式会社A", "商品", "食品" }; string[] csvdata2 = { "実績", "あり", "商品", "文具", "取引先", "株式会社B", "場所", "大阪", "実店舗", "あり" }; //csvのリストを作成 List<string[]> csvall = new List<string[]>(); //リストにcsvデータを追加 csvall.Add(csvdata); csvall.Add(csvdata2); //dictionary型に入れ込む foreach (var a in csvall) { var csv_dict = new Dictionary<string, string>(); for (int i = 0; i < a.Length; i += 2) { csv_dict.Add(a[i], a[i + 1]); } dict_col.Add(csv_dict); } //datatableのカラムにcsv_dictからキーを取り出して一通り入れる foreach (var b in dict_col) { List<string> keysList = b.Keys.ToList(); //keyの一覧リストを作成して foreach (string key in keysList) //データテーブルのカラムに追加していく { //データテーブルのカラムに既に存在しないか(重複)を //確認。重複していた場合追加しない if (0 <= Array.IndexOf(dt.Columns.list,key) //※1うまくいっていません { dt.Columns.Add(key); } } } //未実装:データテーブルにValueを入れていく dataGridView1.DataSource = dt; } } }

現状困っている点
・※1 のところですが
dt.Columns.Addで例外処理(すでにkeyが存在している)が発生してしまうので
https://dobon.net/vb/dotnet/programing/arraycontains.html
こちらを参考に
重複していないときのみ、keyを追加するようにしたいのですが
using System.Data;
を記述しているのですが
DataColumnCollection
に対して、.Listがインテリセンスされません。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

SurferOnWww

2022/05/20 22:41

目的は何ですか? CSV からカスタムクラスのオブジェクトを作りたいと言うのは手段であって目的ではないですよね。それを作って何をしたいのかの目的も書いてもらえると、別の手段 (ひょっとしたらもっと適した) の提案が出てくるかもしれません。
SurferOnWww

2022/05/20 22:48

何を何で作っているか書いてください。(例: Windows Forms を Visual Studio 2022 でターゲットフレームワークを .NETFramework4.8 にして作ってます・・・とか)
SurferOnWww

2022/05/22 00:40

質問者さん、無言ですが、回答されているのでそれらに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。 あと、上のコメントでお願いした質問への追記・修正の依頼への対応もやってください。
YU-N

2022/05/22 01:22

すみません。teratailの使い方もよくわかっておらず 回答以外にコメントを頂いていることに気付いておりませんでした。 返信が遅くなったこと、お詫び申し上げます。 ご指摘の通り、質問は私が思いついた範囲の手段であり 目的は質問にあるような形態のcsvファイルが複数供給され それをDataGridViewに表示し、DataGridViewの編集結果を保存したい といったことになります。 また、何で何を作っているかですが VisualStudio2022でWindowsForms フレームワークは.NET Framework4.7.2 になります。 自分で少し調べて(頂いたURLも参考にして) Datatableを作成してDataGridViewに表示させるところはできそうです。 あとは、ご教示頂いた、Dictionaryクラスに、CSVの項目と内容を入れ込んで DataGridViewで表示されるようにできれば、というところです。
SurferOnWww

2022/05/22 01:32

上に書かれた「目的」と「何で何を作っているか」は追加情報として質問欄に追記していただくようお願いします。ここは「質問への追記・修正の依頼」をするところですので。
SurferOnWww

2022/05/25 07:38 編集

今頃になって何ですがやっと質問者さんのやりたいことが分かったような気がします。 > 05.25追記 > インプットとなるcsvファイルは複数ファイルです。 それは質問に追記したコードにある、 string[] csvdata = { "場所", "東京", "取引先", "株式会社A", "商品", "食品" }; string[] csvdata2 = { "実績", "あり", "商品", "文具", "取引先", "株式会社B", "場所", "大阪", "実店舗", "あり" }; のことだと思いますが、それを CVS ファイルと言うかどうかはとりあえずちょっと置いといて、やりたいことは、 (1) その string の配列の中に「場所」「取引先」「商品」「実績」「実店舗」という文字列があれば、 (2) 配列の中の当該文字列の次の要素を抜き出して質問に貼った画像のような形で DataTable に格納し、 (3) それを DataGridView に表示し、 (4) ユーザーが DataGridView を見てその内容を編集し、 (5) 結果を CSV ファイルに書き出す。 ・・・ということで良いのですか?
YU-N

2022/05/25 10:27

SurferOnWww様 >それを CVS ファイルと言うかどうかはとりあえずちょっと置いといて すみません。便宜上このようにコードを書かせて頂きました。 >(1) その string の配列の中に「場所」「取引先」「商品」「実績」「実店舗」という文字列があれば 少し違います。 あくまでCSV(この例でいう配列)には 項目名,内容,項目名,内容,項目名,内容・・・ と連続したデータが入っているということです。 「場所」「取引先」「商品」「実績」「実店舗」と、この文字列が必ずしも決め打ちとは限らない、という想定です。 (2)~(5)まではおっしゃる通りです。
YU-N

2022/05/25 10:33

失礼しました。下にコード回答頂いておりました。確認させて頂きます。
SurferOnWww

2022/05/25 12:05 編集

(1) ~ (2) がかなり無理目なことをしていると思いますよ。特に、 > 「場所」「取引先」「商品」「実績」「実店舗」と、この文字列が必ずしも決め打ちとは限らない、という想定です。 というところ。決め打ちとは限らないって、誰が(何が)どうやって決めるのですか? ただ何となくテキトーにではなさそうなので、何か決める基準とかあると思いますが、そこを詳しく、ここに書いてないことは知り得ない第三者が読んで分かるように書いてください。 質問に書かれたコードははっきり言ってメチャクチャという感じで、そこはもちろん、固定であっても DataTable が作れるようになっているとは思えませんけど?
SurferOnWww

2022/05/25 12:24

もう一つ。 > すみません。便宜上このようにコードを書かせて頂きました。 便宜上とかで訳の分からないコードを書くのではなく、あなたの言う「複数の CVS ファイル」とは何かを、これもまた詳しく ここに書いてないことは知り得ない第三者が読んで分かるように書いてください。
YT0014

2022/05/25 12:54

対象になるCSVファイルは、何行程度なのでしょうか? また、複数行の場合、行ごとに項目名や列数が異なるのでしょうか?
SurferOnWww

2022/05/26 01:00

さらにもう一つ質問。 あなたの言う「CVS ファイル」の形式を以下のように見直す余地はありませんか? 場所,取引先,商品 東京,株式会社A,食品 ...他の行(もしあれば)... 実績,商品,取引先,場所,実店舗 あり,文具,株式会社B,大阪,あり ...他の行(もしあれば)...
SurferOnWww

2022/05/26 02:00

上の 2022/05/26 10:00 の私のコメントで書いた形(いわゆる一般的に言う CVS 形式)に見直すことができるなら、それぞれの CSV の DataTable を作ってそれを Merge メソッドで合体する方法を取ることをお勧めします。そうすれば Dictionary がどうのこうのと悩まずに簡単に DataTable が得られます。
SurferOnWww

2022/05/26 02:41

質問者さん、反応がないですが、「CVS ファイル」の形式を以下のように見直すということでサンプルを回答欄に追記したので見てください。 場所,取引先,商品 東京,株式会社A,食品 ...他の行(もしあれば)... 実績,商品,取引先,場所,実店舗 あり,文具,株式会社B,大阪,あり ...他の行(もしあれば)...
SurferOnWww

2022/05/28 02:44 編集

前にも書きましたが・・・ 質問者さん、無言ですが、追加の回答がされているのでそれらに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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