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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

2120閲覧

csvファイルを読み込み操作

KOUasO

総合スコア1

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

1グッド

0クリップ

投稿2020/10/20 16:43

編集2020/10/21 02:25

前提・実現したいこと

前提
①読み込むcsvファイルのカラムと完全一致ではなく一部一致なので割り当てるデータが無い場合も存在します。
②読み込むcsvファイルのカラム順は固定されています。

実現したいこと
ファイルを読み込みそのファイルをDataGridViewのカラムごとに割り当てたいです。
理解ができておらず説明が不足している部分が多々あると思いますが、よろしくお願いします
質問内容
読み込んだデータを挿入する方法を知りたいです
csvファイルに無い列に関しては空にしたいです。 「空」の文字列("")で作成したいです。
読み込むcsvファイル
コード,名前,生息地,番号,メールアドレス
0001,佐藤,神奈川県,0000-00-0000,nakayama@aaa.com
0002,土田,新潟県,0120-00-1245,sdjnaidm@aaa.com
0003,中山,富山県,0786-00-0000,fhsuw@aaa.com
0004,田中,愛知県,0516-00-2652,aaaaa@aaa.com
0005,山田,石川県,0585-58-5482,yamada@aaaa.com
0006,鈴木,山梨県,0555-55-5555,suzuki@aaaa.com
0007,大田,福岡県,5584-58-2541,oota@saaa.com

読み込み時使用しているソースコード

C#

1private void Read_csv(string filepath) 2 { 3 DataTable dataTable = new DataTable(); 4 string[] lines = File.ReadAllLines(filepath,Encoding.GetEncoding("Shift_JIS")); 5 if(lines.Length>0) 6 { 7 string firstline = lines[0]; 8 string[] strHeader = firstline.Split(','); 9 foreach(string strWorld in strHeader) 10 { 11 dataGridView1.Columns.Clear(); 12 dataTable.Columns.Add(new DataColumn(strWorld)); 13 } 14 for(int row=1;row<lines.Length;row++) 15 { 16 string[] word = lines[row].Split(','); 17 DataRow dataRow = dataTable.NewRow(); 18 int columindex = 0; 19 foreach(string strWorld in strHeader) 20 { 21 dataRow[strWorld] = word[columindex++]; 22 } 23 dataTable.Rows.Add(dataRow); 24 } 25 }

### このレイアウトに変換したい

c#

1DataTable table = new DataTable("Table"); 2 3 // カラム名を指定 4 table.Columns.Add("名前"); 5 table.Columns.Add("メールアドレス"); 6 table.Columns.Add("番号"); 7 table.Columns.Add("役職"); 8 table.Columns.Add("生息地"); 9       table.Columns.Add("年齢"); 10 table.Columns.Add("コード"); 11 12 13 14 // 該当するデータを追加する(現在仮で記入、配列?で回す) 15 table.Rows.Add("B","E","D","F","C","Z","A"); 16 17 dataGridView1.DataSource = table;

補足情報(FW/ツールのバージョンなど)

visual studio2017

退会済みユーザー👍を押しています

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

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

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

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

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

gentaro

2020/10/20 17:09 編集

やりたいことが書いてあるだけで、質問したい内容が一切書かれていませんけど。
KOUasO

2020/10/20 17:17

すみませんすぐ編集致します。質問したい内容はデータの挿入方法を質問したいです。
退会済みユーザー

退会済みユーザー

2020/10/21 00:08

「このレイアウトに変換したい」という DataTable の列の「役職」と「年齢」が CSV ファイルに無いようですが、それはどういう値にするのですか? 逆に CSV ファイルの「コード」が 「このレイアウトに変換したい」という DataTable にありませんが、それでいいのですか?
退会済みユーザー

退会済みユーザー

2020/10/21 00:11

もう一つ質問。「このレイアウトに変換したい」という DataTable の各列の型はどうするのですか? すべて String 型でいいのですか?
退会済みユーザー

退会済みユーザー

2020/10/21 00:16

タグ DataGrid が間違ってます。訂正してください。DataGridView のはず。
KOUasO

2020/10/21 00:33

csvファイルに無い列に関しては空にしたいです。 全てstringの型で大丈夫かと思います。 ①ファイル読み込んでレイアウト変更→②datagridviewに表示→③datagridviewの内容出力でcsvファイル作成 という手順でやる以外に思いつかなかったので①は型stringでも大丈夫かと。。
退会済みユーザー

退会済みユーザー

2020/10/21 01:14

上のコメントの情報を質問欄を編集して追記願います。ここのコメントは、上に書いてあるように「質問への追記・修正」を依頼するためのものです。初期画面では閉じていて読まない人もいますので。 > csvファイルに無い列に関しては空にしたいです。 「空」というのは null でなく "" または String.Empty で良いのですね? > ②datagridviewに表示→③datagridviewの内容出力でcsvファイル作成 DataGridView に表示するだけでなく、編集してその結果を CSV ファイルにしたいということですね? それも質問欄に追記してください。
退会済みユーザー

退会済みユーザー

2020/10/21 01:17 編集

あと、細かいことを言うようですが、 × datagridview 〇 DataGridView です。C# なのですから。(一事が万事その調子で、書いたコードもそんな感じなのではと思われますよ)
退会済みユーザー

退会済みユーザー

2020/10/21 01:29

以下の質問に答えがありませんが? 逆に CSV ファイルの「コード」が 「このレイアウトに変換したい」という DataTable にありませんが、それでいいのですか? 編集してその結果を CSV ファイルにしたいということのようですので、その時には必要なのではと想像してますが。
KOUasO

2020/10/21 01:33

逆に CSV ファイルの「コード」が 「このレイアウトに変換したい」という DataTable にありませんが、それでいいのですか? についてなのですが、必要になります。 こちらも修正致します。
退会済みユーザー

退会済みユーザー

2020/10/21 02:19

DataGridView に表示するだけでなく、編集してその結果を CSV ファイルにしたいということですね? それも質問欄に追記してください。
退会済みユーザー

退会済みユーザー

2020/10/21 02:20

>> 逆に CSV ファイルの「コード」が 「このレイアウトに変換したい」という DataTable にありませんが、それでいいのですか? > についてなのですが、必要になります。こちらも修正致します。 まだ修正されてないようですが?
Zuishin

2020/10/21 02:27

回答がついた質問を削除して別アカウントで同じ質問ってどういう了見だ?
退会済みユーザー

退会済みユーザー

2020/10/21 03:17

普通の社会生活なら淘汰されて目にしなくて済むのですが、匿名でいくつでもアカウントが作れるようなユーザー管理が甘いサイトにはこういう人もいる・・・というのは分かっていたはずですが、また認識を新たにしました。
退会済みユーザー

退会済みユーザー

2020/10/21 04:11

Zuishin様 ご指摘ありがとうございます そして複数アカウントでの投稿申し訳ございません 質問の記述に多数誤字脱字等、問題があり何度か読み直し修正を試みましたが、この質問そのものが理解し難く、利用する方のノイズになってしまうと判断して削除リクエストを送信致しました。 削除リクエスト送信したタイミングと回答して下さった方の送信のタイミングが同タイミングだったため回答が来ていない認識でした。 失礼な行いをしてしまい申し訳ございません。
退会済みユーザー

退会済みユーザー

2020/10/21 04:25

そもそも複数アカウントIDを取得するのは利用規約違反です。
KOUasO

2020/10/21 04:30

利用規約確認怠っていました。早急にアカウント退会致します
guest

回答3

0

ベストアンサー

C#

1foreach(string strWorld in strHeader) 2{ 3 dataGridView1.Columns.Clear(); 4 dataTable.Columns.Add(new DataColumn(strWorld)); 5}

ここで列を作成しているので、必要なフォーマットで生成するようにして

C#

1foreach(string strWorld in strHeader) 2{ 3 dataRow[strWorld] = word[columindex++]; 4}

ここでデータをセットしているので、必要な項目のみセットすればいいのではないですか?

その他にDataView.ToTableメソッドを使うという方法でもよいかもしれません。

投稿2020/10/20 22:22

編集2020/10/20 22:36
YAmaGNZ

総合スコア10489

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

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

KOUasO

2020/10/21 01:05

説明不足している中、ご回答ありがとうございます。 試してみます。
guest

0

DataColumn.SetOrdinal(Int32) メソッド で、DataTable列の並び順を変える事が出来ます。

csharp

1 //とりあえずDataTableに4列作成 2 DataTable table = new DataTable(); 3 table.Columns.Add("Item1", typeof(String)); 4 table.Columns.Add("Item2", typeof(String)); 5 table.Columns.Add("Item3", typeof(String)); 6 table.Columns.Add("Item4", typeof(String)); 7 8 //データ追加 9 for (int y = 1; y <= 9; y++) 10 { 11 table.Rows.Add(new string[] {$"1{y}", $"2{y}", $"3{y}", $"4{y}" }); 12 } 13 14 //後から二列増やした 15 table.Columns.Add("Item5", typeof(string)); 16 table.Columns.Add("Item6", typeof(string)); 17 18 //並びをItem3,5,1,2,4,6にする 19 table.Columns["Item3"].SetOrdinal(0); 20 table.Columns["Item5"].SetOrdinal(1);

(実行結果)
イメージ説明

ただ、あらかじめ出力したい順序の列を作成してから、それに合わせたデータを追加する方が速いとは思います。

投稿2020/10/21 01:45

編集2020/10/21 01:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

CSV ファイルからデータを取得して Windows Forms アプリの DataGridView に表示し、それをユーザーが編集して結果を CSV ファイルに書き出す方法を書いた記事を紹介します。

CSV ファイルを DataGridView に表示
http://surferonwww.info/BlogEngine/post/2020/09/11/show-date-in-csv-file-on-datagridview.aspx

これの応用でやりたいことはできると思います。

TextFieldParser を使う案と、ADO.NET + OelDb + JET を使う案の 2 案書いてありますが、前者の方を見てください。

記事では CSV ファイルのヘッダから DataTable の列を作っていますが、そこはスキップしてください。

代わりに、あらかじめ「このレイアウトに変換したい」に書いてあるように必要な列を追加した DataTable を作ってそれを使ってください。

上に紹介した記事の while (!tfp.EndOfData) ループの中で、作った DataTable の各行・各列に CSV ファイルの値、CVS ファイルにない列は "" を代入すれば良いと思います。

不明点があればこの回答のコメント欄に書いてください。

投稿2020/10/21 01:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問