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

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

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

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

C#

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

3054閲覧

DataGridViewのヘッダーの取得してCSVに表示すると列表示になる

xlostdjx

総合スコア39

CSV

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

C#

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/06/22 02:22

Visual Studio2015の Windows Forms アプリ

下記のようにDataGridViewのヘッダーを取得してCSVに書き込みすると列の頭だけに表示させたいのですが列と行にずらりと表示されてしまします
どこがおかしいのでしょうか?

strList.Add(DataGrid.Columns[j].HeaderCell.Value.ToString());

C#

1 /// <summary> 2 /// CSV出力ボタン押下時 3 /// </summary> 4 private void CSV_Output_Click(object sender, EventArgs e) 5 { 6 // SaveFileDialogを作成する 7 SaveFileDialog result = new SaveFileDialog(); 8 result.Title = "ファイルを保存する"; 9 // 初期表示時のディレクトリを指定 10 result.InitialDirectory = @"C:\Users\Admin\Downloads"; 11 // ファイル名を指定、取得する 12 result.FileName = @"ForOutput.csv"; 13 // 選択できるファイルの種類を指定する 14 result.Filter = "CSV (カンマ区切り)|*.csv"; 15 // ファイル出力(保存)ダイアログ表示  16 DialogResult FileOutput = result.ShowDialog(); 17 18 // //「保存」ボタンが押された時の処理 19 if (FileOutput == DialogResult.OK) 20 { 21 //指定されたファイルのパスを取得する 22 string fileName = result.FileName; 23 } 24 else if (FileOutput == DialogResult.Cancel) 25 { 26 //「キャンセル」ボタンまたは「×」ボタンが選択された時の処理 27 } 28 29 // 保存用のファイルを開く ( ファイルパス )( ファイル名 ) (文字コード指定) 30 using (StreamWriter writer = new StreamWriter(@"C:\Users\Admin\Downloads\ForOutput.csv", false, Encoding.GetEncoding("shift_jis"))) 31 { 32 // 行数を取得する 33 int rowCount = DataGrid.Rows.Count; 34 if (DataGrid.AllowUserToAddRows == true) 35 { 36 // 最後の新規入力用の1行分を差し引く 37 rowCount = rowCount - 1; 38 } 39 40 // rowCount 行数文ループ 41 for (int i = 0; i < rowCount; i++) 42 { 43 // リストの初期化 44 List<String> strList = new List<String>(); 45 46 // Columns.Count カルムと同じ数だけループする 47 for (int j = 0; j < DataGrid.Columns.Count; j++) 48 { 49 //列と行を追加していく。 50 strList.Add(DataGrid[j, i].Value.ToString()); 51 52 53 54 *おかしい箇所→→ //ヘッダを出力 * 55 strList.Add(DataGrid.Columns[j].HeaderCell.Value.ToString()); 56 57 58 59 } 60 61 // 配列へ変換 62 String[] strArray = strList.ToArray(); 63 // CSV 形式に変換(ファイル出力) 64 String strCsvData = String.Join(",", strArray); 65 writer.WriteLine(strCsvData); 66 } 67 } 68 }

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

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

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

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

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

guest

回答2

0

行数文ループの中で毎回ヘッダー出力しているからです。
forの前に記述して下さい。

投稿2018/06/22 02:36

sazi

総合スコア25138

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

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

xlostdjx

2018/06/22 04:33

forの前に記述したのですが表示されないです。 // 保存用のファイルを開く ( ファイルパス )( ファイル名 ) (文字コード指定) using (StreamWriter writer = new StreamWriter(@"C:\Users\Admin\Downloads\ForOutput.csv", false, Encoding.GetEncoding("shift_jis"))) { int ColumnsCount = DataGrid.ColumnCount; int rowCount = DataGrid.Rows.Count; if (DataGrid.AllowUserToAddRows == true) { // 最後の新規入力用の1行分を差し引く rowCount = rowCount - 1; } //ヘッダを出力 DataGrid.Columns[9].HeaderCell.Value.ToString(); // rowCount 行数文ループ for (int i = 0; i < rowCount; i++) { // リストの初期化 List<String> strList = new List<String>(); // Columns.Count カルムと同じ数だけループする for (int j = 0; j < DataGrid.Columns.Count; j++) { //列と行を追加していく。 strList.Add(DataGrid[j, i].Value.ToString()); } // 配列へ変換 String[] strArray = strList.ToArray(); // CSV 形式に変換(ファイル出力) String strCsvData = String.Join(",", strArray); writer.WriteLine(strCsvData); } } }
sazi

2018/06/22 04:43

リストに入れるところからやらないと駄目ですよ
xlostdjx

2018/06/22 04:49

ど忘れしていました。申し訳ないです。
xlostdjx

2018/06/22 05:57

最後に質問です。間違いとかではなく 気になったのですが、 配列に変換したものをString.Joinでカンマ区切りで指定しているのですが カンマ区切りをするとなぜ行ずつ分けられて出力されるのでしょうか?? 自分の考えだと末尾にカンマがつくだけと思っています。 調べてみてもピンとこなかったので、 // CSV 形式に変換(列と行を出力) //カンマ区切り String stgCsvData = String.Join(",", stgArray);
guest

0

ベストアンサー

出力したい内容は下記の内容だと思います。


見出し1,見出し2,見出し3,見出し4
データ1-1,データ1-2,データ1-3,データ1-4
データ2-1,データ2-2,データ2-3,データ2-4
データ3-1,データ3-2,データ3-3,データ3-4
データ4-1,データ4-2,データ4-3,データ4-4


上記の内容を出力しようとすると、ヘッダ部は最初に1回だけ
出力すればいいだけです。
ですので、データ部分の出力のループに入れるのではなく、
ヘッダ部の出力とデータ部の出力を分けてください。

List<String> strList; strList = new List<String>(); // ヘッダ部の出力 // Columns.Count カルムと同じ数だけループする for (int j = 0; j < DataGrid.Columns.Count; j++) { //カラムのヘッダのテキストをリストに追加 } // 配列へ変換 // CSV 形式に変換(ファイル出力) // データ部の出力 // rowCount 行数文ループ for (int i = 0; i < rowCount; i++) { // リストの初期化 strList = new List<String>(); // Columns.Count カルムと同じ数だけループする for (int j = 0; j < DataGrid.Columns.Count; j++) { //列と行を追加していく。 } // 配列へ変換 // CSV 形式に変換(ファイル出力) }

元ソースのコメントを入れて、分かりやすくしてみました。

DataGridViewからCSVへ出力するサンプルは検索すればたくさん出てきますから
参照されてはどうでしょう?

投稿2018/06/22 02:34

編集2018/06/22 04:56
YAmaGNZ

総合スコア10222

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

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

xlostdjx

2018/06/22 04:34

このやり方だとダメということですか?? // 配列へ変換 String[] strArray = strList.ToArray(); // CSV 形式に変換(ファイル出力) String strCsvData = String.Join(",", strArray); writer.WriteLine(strCsvData);
YAmaGNZ

2018/06/22 04:56

元ソースを元に回答を編集しました。
xlostdjx

2018/06/22 05:57

最後に質問です。間違いとかではなく 気になったのですが、 配列に変換したものをString.Joinでカンマ区切りで指定しているのですが カンマ区切りをするとなぜ行ずつ分けられて出力されるのでしょうか?? 自分の考えだと末尾にカンマがつくだけと思っています。 調べてみてもピンとこなかったので、 // CSV 形式に変換(列と行を出力) //カンマ区切り String stgCsvData = String.Join(",", stgArray);
YAmaGNZ

2018/06/22 06:22

String.Join(",", stgArray)で各項目をカンマで繋ぐだけというのは合っています。 次の「WriteLine」は1行書き込むです。ここで改行コードが付加されて書き込まれます。
xlostdjx

2018/06/22 06:58

各項目をカンマで繋ぐだけというのは合っています。 とありますが、CSVに出力したときに行末尾にカンマが表示されていませんがそのあたりはどういうことなのでしょうか??またカンマで繋ぐから表示されないのか??
YAmaGNZ

2018/06/22 07:02

各項目にカンマを付与するのではなく「繋ぐ」ということです。 AとBとCがあって、これをカンマで繋ぐとしたら A,B,Cになりますよね?
xlostdjx

2018/06/22 07:09

先程、カンマをピリオドに変えて実行した所 行が他の行と繋がったまま表示されたのですが カンマとピリオドでなぜここまで変わるのでしょうか??
YAmaGNZ

2018/06/22 07:13

CSVファイルは「カンマ区切り」のテキストファイルです。 カンマがなくなれば、1つの項目となります。
xlostdjx

2018/06/22 07:17

少し意味を履き違えていたみたいで、エクセルはカンマが表示されないものなのでしょうか??
YAmaGNZ

2018/06/22 07:26

先ほど書いたようにCSVファイルとは各項目をカンマで区切ったテキストファイルです。 実際に出力したものを見たいのであれば、メモ帳などのテキストエディタで見てください。 Excelは各項目を見やすく表示するためカンマを省略して各セルに格納してくれているのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問