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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

Q&A

解決済

2回答

11435閲覧

C# csvファイルの読み込みとDataGridへの表示

sr3fecoo7

総合スコア7

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

0グッド

1クリップ

投稿2018/05/02 15:35

編集2018/05/03 01:54

前提・実現したいこと

"作品名","作者","出版社","巻数","記入日",
A,AA,AAA,AAAA,2018/05/02 (水) 15:10:24
B,BB,BBB,BBBB,2018/05/02 (水) 15:10:36
C,CC,CCC,CCCC,2018/05/02 (水) 15:10:46

上記の様なcsvファイルを読み込んで、DataGridコントロールに表示したいです。

下記のコードでList<T>に読み込めていると思うのですが、
そこからDataGridコントロールに表示する方法が分かりません。
List<T>のままなのか、一度配列に直すのか?
どうすればよいでしょうか?

発生している問題・エラーメッセージ

該当のソースコード

XAML

1<DataGrid Name="DataGrid_CSV" 2 HorizontalAlignment="Left" VerticalAlignment="Top" 3 Margin="70,267,0,0" 4 />

C#

1public partial class MainWindow : Window 2{ 3 public MainWindow() 4 { 5 InitializeComponent(); 6 } 7 8 // 保存ファイルのフルパス デフォルト値 9 static string PATH_FILE = ""; 10 11 // 読み込みボタン 押下イベント 12 private void Btn_Read_Click(object sender, RoutedEventArgs e) 13 { 14 // 対象ファイルを選択していないときはファイルダイアログを開く 15 if (PATH_FILE == "") { Fnc_Dialog_Save(); } 16 else { Fnc_Read(); } 17 } 18 19 // 開くダイアログ 20 public void Fnc_Dialog_Open() 21 { 22 //OpenFileDialogクラスのインスタンスを作成 23 var ofd = new OpenFileDialog 24 { 25 //はじめに「ファイル名」で表示される文字列を指定する 26 FileName = "BookList.csv", 27 //はじめに表示されるフォルダを指定する 28 InitialDirectory = @"C:\", 29 //[ファイルの種類]に表示される選択肢を指定する 30 Filter = "csvファイル(*.csv)|*.csv", 31 //タイトルを設定する 32 Title = "開くファイルを選択してください", 33 //ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする 34 RestoreDirectory = true 35 }; 36 37 // ダイアログを表示 38 if (ofd.ShowDialog() == true) 39 { 40 // ファイルパス取得 41 PATH_FILE = ofd.FileName; 42 43 // 対象ファイルを選択していないときはファイルダイアログを開く 44 if (PATH_FILE == "") { return; } 45 else { Fnc_Read(); } 46 } 47 } 48 49 // ファイル読み込み処理 50 public void Fnc_Read() 51 { 52 try 53 { 54 // 読み込み用リスト作成 55 List<string[]> readCsvList = new List<string[]>(); 56 57 // csvファイルを開く 58 using (var sr = new StreamReader(PATH_FILE, Encoding.GetEncoding("Unicode"))) 59 { 60 // ストリームの末尾まで繰り返す 61 while (!sr.EndOfStream) 62 { 63 // ファイルから一行読み込む 64 var readCsvLine = sr.ReadLine(); 65 // カンマ区切りで分割して配列に格納する 66 readCsvList.Add(readCsvLine.Split(',')); 67 } 68 } 69 70 // DataGridに出力 71 72 } 73 catch (System.Exception e) 74 { 75 // ファイルを開くのに失敗したとき 76 MessageBox.Show(e.ToString()); 77 } 78 } 79}

試したこと

参考にしたコードでは「ItemsSource」プロパティを使用していましたが、実行結果は狙ったものにはなりませんでした。

C#

1DataGrid_CSV.ItemsSource = readCsvList;

実行結果
|Length|LongLength|Rank|SyncRoot|IsReadOnly|IsFixedSize|IsSynchronized|
|:--|:--:|--:||:--|:--:|--:|
|6|6|1|System.string[]|□|□|□|
|6|6|1|System.string[]|□|□|□|

の様に表示されてしまい、読み込んだCSVファイルの内容を表示できません。

また主題とは別に、List<T>の中身を確認するにはどうすればよいでしょうか?

C#

1foreach (string str in readCsvList) 2 { 3 4 }

のようにすると、型変換のエラーとなってしまいます。

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

VisualStuido2017
WPFアプリ(.NET Framework)

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

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

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

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

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

guest

回答2

0

ベストアンサー

DataGridにはItemsSourceにクラスのコレクションを入れると、クラスのプロパティ名を列ヘッダに入れてくれる機能があります。
ここでは匿名クラスを使います。

C#

1// DataGridに出力 2var itemsSource = readCsvList.Skip(1) 3 .Select(l => new 4 { 5 作品名 = l[0], 6 作者 = l[1], 7 出版社 = l[2], 8 巻数 = l[3], 9 記入日 = l[4] 10 }); 11 12DataGrid_CSV.IsReadOnly = true; 13DataGrid_CSV.ItemsSource = itemsSource;

また主題とは別に、List<T>の中身を確認するにはどうすればよいでしょうか?

readCsvList に代入した後の行にブレークポイントを置いて、デバッグ実行で止まったときにreadCsvListにカーソルを合わせます。

投稿2018/05/03 01:47

hihijiji

総合スコア4150

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

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

sr3fecoo7

2018/05/03 02:54

ご回答ありがとうございます。 DataGridの表示は狙った動きとなりました。 コードの理解が不十分のため、宜しければもう少し詳しくご説明頂けませんでしょうか?
guest

0

DataGridView へ表示するには、

CSharp

1dataGridView1.DataSource = readCsvList;

で、どうでしょうか?

List<T>の中身をコードで確認する場合には、
readCsvList は string の List ではなく、string[] の List なので、

CSharp

1foreach (string[] strList in readCsvList) 2{ 3 foreach(string str in strList) 4 { 5 6 } 7}

と、すると良いでしょう

投稿2018/05/02 17:28

koguma98

総合スコア288

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

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

sr3fecoo7

2018/05/03 01:46

ご回答ありがとうございます。 List<T>の中身はご指摘のコードで確認ができました。 DataGridへの表示は適切なプロパティが分からず、まだ上手くいっておりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問