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

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

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

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

9355閲覧

CSVを読み込んでDataGridViewに表示させたい。

natume4948

総合スコア9

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2021/04/14 06:22

編集2021/04/15 01:05

前提・実現したいこと
DataGridViewにOpenDialogで選択したCSVファイルを表示させたい。
ここに質問の内容を詳しく書いてください。
WindowsFormsを使ってOpenDialogで選択したCSVファイルをDataGridViewを表示させたい。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラー文
Microsoft.VisualBasic.FileIO.MalformedLineException: '現在の区切り記号を使用して、行 5 を解析できません。'

C#エラー場所

1while (!parser.EndOfData) 2 { 3 data = parser.ReadFields(); 4 int fieldCount = data.Length; 5 DataRow row = dt.NewRow(); 6 for (int i = 0; i < fieldCount; i++) 7 { 8 row[i] = data[i]; 9 } 10 dt.Rows.Add(row); 11 }

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.IO; 11using Microsoft.VisualBasic.FileIO; 12 13namespace WIN課題7 14{ 15 public partial class Form1 : Form 16 { 17 DataTable dt = new DataTable(); 18 19 public Form1() 20 { 21 InitializeComponent(); 22 } 23 24 25 private void ReadCSV(DataTable dt, bool hasHeader, string FileName) 26 { 27 //CSVを便利に読み込んでくれるTextFieldParserを使います。 28 TextFieldParser parser = new TextFieldParser(FileName, Encoding.GetEncoding("shift_jis")); 29 //これは可変長のフィールドでフィールドの区切りのマーカーが使われている場合です。 30 //フィールドが固定長の場合は 31 //parser.TextFieldType = FieldType.FixedWidth; 32 parser.TextFieldType = FieldType.Delimited; 33 34 string[] data; 35 //ここのif文では、DataTableに必要なカラムを追加するために最初に1行だけ読み込んでいます。 36 //データがあるか確認します。 37 if (!parser.EndOfData) 38 { 39 //CSVファイルから1行読み取ります。 40 data = parser.ReadFields(); 41 //カラムの数を取得します。 42 int cols = data.Length; 43 if (hasHeader) 44 { 45 for (int i = 0; i < cols; i++) 46 { 47 dt.Columns.Add(new DataColumn(data[i])); 48 } 49 } 50 else 51 { 52 for (int i = 0; i < cols; i++) 53 { 54 //カラム名にダミーを設定します。 55 dt.Columns.Add(new DataColumn()); 56 } 57 //DataTableに追加するための新規行を取得します。 58 DataRow row = dt.NewRow(); 59 for (int i = 0; i < cols; i++) 60 { 61 //カラムの数だけデータをうつします。 62 row[i] = data[i]; 63 } 64 //DataTableに追加します。 65 dt.Rows.Add(row); 66 } 67 } 68 //ここのループがCSVを読み込むメインの処理です。 69 //内容は先ほどとほとんど一緒です。 70 while (!parser.EndOfData) 71 { 72 data = parser.ReadFields(); 73 DataRow row = dt.NewRow(); 74 for (int i = 0; i < dt.Columns.Count; i++) 75 { 76 row[i] = data[i]; 77 } 78 dt.Rows.Add(row); 79 } 80 } 81 82 83 84 private void button1_Click(object sender, EventArgs e) 85 { 86 //OpenFileDialogクラスのインスタンスを作成 87 OpenFileDialog ofd = new OpenFileDialog(); 88 89 //はじめのファイル名を指定する 90 //はじめに「ファイル名」で表示される文字列を指定する 91 ofd.FileName = "default"; 92 //はじめに表示されるフォルダを指定する 93 //指定しない(空の文字列)の時は、現在のディレクトリが表示される 94 ofd.InitialDirectory = @"C:\"; 95 //[ファイルの種類]に表示される選択肢を指定する 96 //指定しないとすべてのファイルが表示される 97 ofd.Filter = "CSVファイル(*.csv;*.csv)|*.html;*.htm|すべてのファイル(*.*)|*.*"; 98 //[ファイルの種類]ではじめに選択されるものを指定する 99 //2番目の「すべてのファイル」が選択されているようにする 100 ofd.FilterIndex = 2; 101 //タイトルを設定する 102 ofd.Title = "開くファイルを選択してください"; 103 //ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする 104 ofd.RestoreDirectory = true; 105 //存在しないファイルの名前が指定されたとき警告を表示する 106 //デフォルトでTrueなので指定する必要はない 107 ofd.CheckFileExists = true; 108 //存在しないパスが指定されたとき警告を表示する 109 //デフォルトでTrueなので指定する必要はない 110 ofd.CheckPathExists = true; 111 //ダイアログを表示する 112 if (ofd.ShowDialog() == DialogResult.OK) 113 { 114 115 ReadCSV(this.dt, true, ofd.FileName); 116 this.dataGridView1.DataSource = this.dt; 117 Console.WriteLine(ofd.FileName); 118 } 119 MessageBox.Show("CSVデータの読込みが完了しました。"); 120 121 122 123 } 124 125 private void textBox1_TextChanged(object sender, EventArgs e) 126 { 127 128 } 129 private void Form1_Load(object sender, EventArgs e) 130 { 131 132 } 133 134 135 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 136 { 137 138 } 139 } 140}

試したこと

ここに問題に対して試したことを記載してください。
Console.WriteLine(odf.FileName);
でOpenDialogからファイルの受け渡しが出来ているのは出来ているのでReadCSVが未完成状態が原因だと考えています。

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

visual studio2019
イメージ説明
↑現在の状況
イメージ説明###
↑完成形
イメージ説明
↑CSVの中身
ここにより詳細な情報を記載してください。
追記ーーーーーーーーーーー
SurferOnWww様回答ありがとうございます。参考サイトをみて変更してみたのですが、DataGridViewには何も表示されませんでした。自分で原因はここだろうと絞り込んで見たのですが、私の考えとしましてはこれは、""や,の含まれている処理が機能できていないため、何も返ってこないと考えております。CSVの中身も記載しておきます。

C#

1問題点 2private void ReadCSV(DataTable dt, bool hasHeader, string FileName, string separator, bool quote) 3 { 4 //CSVを便利に読み込んでくれるTextFieldParserを使います。 5 TextFieldParser parser = new TextFieldParser(FileName, Encoding.GetEncoding("shift_jis")); 6 Console.WriteLine("OK"); 7 //これは可変長のフィールドでフィールドの区切りのマーカーが使われている場合です。 8 //フィールドが固定長の場合は 9 //parser.TextFieldType = FieldType.FixedWidth; 10 parser.TextFieldType = FieldType.Delimited; 11 parser.Delimiters = new string[] { "," }; 12 // 空白文字をトリム 13 parser.TrimWhiteSpace = true; 14 parser.HasFieldsEnclosedInQuotes = true; 15 Console.WriteLine("OK!"); 16 string[] data; 17 //ここのif文では、DataTableに必要なカラムを追加するために最初に1行だけ読み込んでいます。 18 //データがあるか確認します。 19 if (!parser.EndOfData) 20 { 21 //CSVファイルから1行読み取ります。 22 data = parser.ReadFields(); 23 //カラムの数を取得します。 24 int cols = data.Length; 25 if (hasHeader) 26 { 27 for (int i = 0; i < cols; i++) 28 { 29 dt.Columns.Add(new DataColumn(data[i])); 30 } 31 } 32 else 33 { 34 for (int i = 0; i < cols; i++) 35 { 36 //カラム名にダミーを設定します。 37 dt.Columns.Add(new DataColumn()); 38 } 39 //DataTableに追加するための新規行を取得します。 40 DataRow row = dt.NewRow(); 41 for (int i = 0; i < cols; i++) 42 { 43 //カラムの数だけデータをうつします。 44 row[i] = data[i]; 45 } 46 //DataTableに追加します。 47 dt.Rows.Add(row); 48 } 49 } 50 Console.WriteLine("ここまで"); 51 //ここのループがCSVを読み込むメインの処理です。 52 //内容は先ほどとほとんど一緒です。 53       ↓ここからが原因だと考えます。 54 while (!parser.EndOfData) 55 { 56 data = parser.ReadFields();←エラー 57 int fieldCount = data.Length; 58 DataRow row = dt.NewRow(); 59 for (int i = 0; i < fieldCount; i++) 60 { 61 row[i] = data[i]; 62 } 63 dt.Rows.Add(row); 64 } 65 }

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

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

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

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

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

dodox86

2021/04/14 06:26

SVC、SVCファイルではなくて、CSV、CSVファイルではないでしょうか。SVCファイルとは、マイナーながら別の用途、形式のものがあります。
natume4948

2021/04/14 06:28

すみませんでした。CSVファイルです修正します。
退会済みユーザー

退会済みユーザー

2021/04/15 00:45

どうしてデバッガを使ってどこまで期待通りに進んでいるか、どこでダメになっているか調べないのですか? 質問者さんの環境で、質問者さんのコードを、Visual Studio でデバッガを使ってステップ実行しながら変数を調べて、どこで問題が起きているかを調べることができるのは質問者さんだけということを認識してください。回答者・閲覧者にデバッグを期待しないでください。
natume4948

2021/04/15 01:01

申し訳ございませんデバッグモードを使い原因と思う場所を記載しました。 お暇があれば見ていただけると嬉しいです。
退会済みユーザー

退会済みユーザー

2021/04/15 01:15

> 申し訳ございませんデバッグモードを使い原因と思う場所を記載しました。 「data = parser.ReadFields();←エラー」で「現在の区切り記号を使用して、行 5 を解析できません。」というところですか? 「行 5」を調べたのですか?
natume4948

2021/04/15 01:20

分かりにくくて申し訳ございません。 これはCSVをOpenFileDialogをよみこんだときに例外処理がおきてその文章が「現在の区切り記号を使用して、行5を解析できません」という意味です。
natume4948

2021/04/15 01:25

data = parser.ReadFields();で例外処理が起きているのでそれがDataGiridViewを表示できない原因だと思いました。
natume4948

2021/04/15 01:37

すみません例外処理がMalformedLineExceptionということはTextFieldType Delimiterらが適切に定義されていないのはCSV出力の時点で間違っているのでしょうか?それとも自分の定義がまちがっているのでしょうか?
退会済みユーザー

退会済みユーザー

2021/04/15 01:43

上のコメントで紹介したドキュメントには「この例外には、不適切な行の行番号が含まれています。」と書いてあるのは読みましたか? 「現在の区切り記号を使用して、行 5 を解析できません。」ということは 1 ~ 4 行は問題なく 5 行目にデリミタの形式に問題があると言っているように思えます。そう思えませんか?
natume4948

2021/04/15 01:45

はいそう思います。
退会済みユーザー

退会済みユーザー

2021/04/15 01:51

で、どうするのですか?
natume4948

2021/04/15 01:54

1~4行目のデリミタの形式と5行目のデリミタの形式を比較してみたのですがなにが違うのか分かりませんでした。
退会済みユーザー

退会済みユーザー

2021/04/15 02:11 編集

while ループの中の 1 行目にブレークポイントを設定してデバッグ実行し、そこで止まったらステップ実行してループの 1 ~ 4 行目までは問題なく 5 行目で例外がスローされることを確認するとか、CSV ファイルを変えてみるとかしてはいかがですか?
dodox86

2021/04/15 02:02

横からすみません。 > 1~4行目のデリミタの形式と5行目のデリミタの形式を比較してみたのですがなにが違うのか分かりませんでした。 5行目のデータ行の一部が不正、あるいはCSVのパーサーにとって未知の形式になっていて、区切り文字が正しく認識できなくなっている可能性があります。人間が一見して大丈夫そうにみえても、プログラムにとっては必ずしもそうではありません。「分かりませんでした」では「そうですか。」で話が終わってしまいます。その1〜5行目のデータを質問文中に追記して提示するとかしてみてはいかがですか。
natume4948

2021/04/15 02:20

すみません~行目のデリミタの形式が自分の認識ではCSVファイルの中身であると思っているのですが、それであっているならMusicData.csvを質問文に記載しております。もし違っているなら申し訳ございません教えていただけるとありがたいです。
退会済みユーザー

退会済みユーザー

2021/04/15 02:28 編集

質問の画像を見た限りでは 5 行目と他の行には違いは見当たらず問題なさそうに見えます。だから、 while ループの中の 1 行目にブレークポイントを設定してデバッグ実行し、そこで止まったらステップ実行してループの 1 ~ 4 行目までは問題なく 5 行目で例外がスローされることを確認するとか、CSV ファイルを変えてみるとかしてはいかがですか? ・・・ということをして確認するよう提案してます。やってみたのですか? dodox86 さんが言われるように画像を見ても分からないということもあるので、アドバイスに従って CSV ファイルの文字列を質問に貼ってはいかが? アドバイスされたこと、聞かれたことには答えてもらえないと・・・
natume4948

2021/04/15 02:30

SurferOnWwwさん別のCSVファイルを読み込んでみたところ、出力ができました。
dodox86

2021/04/15 02:33

質問文に追記してみてはと提案もしましたが、私であればその元データであるCSVファイルの当該エラー発生行を正しいはずのデータに修正してみて、どの部分でエラーが出ているか確認します。場合によっては解析に失敗しない、ダミーのCSVデータを作って試します。DataGridViewにデータを表示することと、データを正しく取り込むことは本来、別の話であるからです。
natume4948

2021/04/15 02:47

すみません知識不足で申し訳ないのですが、正しいはずのデータに修正するとは、変数を入れずに直接入れるという認識であっているでしょうか?
dodox86

2021/04/15 03:05

> 知識不足で申し訳ないのですが、正しいはずのデータに修正するとは、変数を入れずに直接入れるという認識であっているでしょうか? 知識と言いますかプログラムに限らず何か困ったことが起きたとして自然に考え、どこで問題が発生しているのかまず切り分ける必要があるということです。 CSVファイルの問題を片付けたいのであれば、CSVファイルの内容を本番用の実データではなく、テスト用の簡単なデータに直接修正してみます。表示だけの問題を確認したいのであれば、CSVファイルを使うのではなく、まずCSVファイルのデータは読めたものとして、ダミーのデータを変数に入れていくようにしたりします。適当に使い分けてください。 あとよくあるのが全角文字を使っていると文字コードの問題(エンコード、デコード)が発現しやすいので、実データではなく、「"1","tune1","artist1","album1","releasedate1","genre1"」のように半角ASCII文字だけで構成させてまず確認したりします。
dodox86

2021/04/15 03:08

(読めていませんでしたが)[2021/04/15 11:30]の本欄コメントを読んで: > SurferOnWwwさん別のCSVファイルを読み込んでみたところ、出力ができました。 ああ、CSVファイルさえ適切であればOKのようですね。
dodox86

2021/04/15 03:42 編集

尚、notepad(メモ帳)をお使いのようですが、CSVファイルをUTF-8で保存していて、読み出しのときにはシフトJISで扱っていた、とのような誤りが無いか、確認することをお勧めします。 > TextFieldParser(FileName, Encoding.GetEncoding("shift_jis"));
退会済みユーザー

退会済みユーザー

2021/04/15 04:03

CSV ファイルの内容に問題があったということは間違いないということははっきりし、解決策が分かったと理解していますが、そうであればこのスレッドはクローズしてください。 元の CSV ファイルのどこがダメだったのか分からず、そこをどうしても確かめたいのであれば、その CSV ファイルをメモ帳で開いて中身を質問欄にコピペしてから聞いてください。
natume4948

2021/04/15 04:08

お二人とも回答ありがとうございます。お陰様で解決できました。本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2021/04/15 06:19

次に質問することがあれば、(1) 例外がスローされているなら、コードのどの行でスローされていてエラーメッセージはどうなっているか、(2) デバッガを使ってステップ実行しながら変数の内容を調べてどこで期待と異なるかなど、まずは自分で徹底的に調べてからにするようお願いします。 今回は、最初の質問で (1) の情報を出せたはずです。
guest

回答1

0

ベストアンサー

以下の記事が参考になりませんか?

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

質問者さんのコードは見てません。見てくれというなら、もっと自分で切り分けして、コードのどこに問題がありそうか書いてください。

投稿2021/04/14 07:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

natume4948

2021/04/14 09:01

回答ありがとうございます。記事を参考に修正して自分の問題点を切り分けてみました。お暇があれば見ていただけるとありがたいです。
退会済みユーザー

退会済みユーザー

2021/04/14 09:15 編集

> 私の考えとしましてはこれは、""や,の含まれている処理が機能できていないため、何も返ってこないと考えております。 そんなことはないと思います。どうしてデバッガを使ってどこまで期待通りに進んでいるか、どこでダメになっているか調べないのですか? 質問者さんの環境で、質問者さんのコードを、Visual Studio でデバッガを使ってステップ実行しながら変数を調べて、どこで問題が起きているかを調べることができるのは質問者さんだけということを認識してください。回答者・閲覧者にデバッグを期待しないでください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問