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

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

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

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

C#

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

解決済

C#でCSVを生成する際、ユーザがダイアログで指定した場所にうまく保存できません。

toshi0607
toshi0607

総合スコア56

CSV

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

C#

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

2回答

0評価

0クリップ

7195閲覧

投稿2015/09/30 16:54

編集2015/10/06 15:26

概要

下記のようなBuilderを記述の上、ユーザが指定した場所にCSVファイルを保存したいです。下記のようにすると、

C:\Users\[ユーザ名]\Documents\Visual Studio 2013\Projects\[プロジェクト名]\[アプリ名]\bin\Debug

下には保存されるのですが、デスクトップ等ユーザが選択した場所に保存できません。

lang

class CsvBuilder : IDisposable { /// <summary> /// CSVファイルに書き込むストリーム /// </summary> private StreamWriter stream = null; /// <summary> /// ファイル名を指定して、 <see cref="CsvWriter">CsvWriter</see> クラスの新しいインスタンスを初期化します。 /// </summary> /// <param name="path">書き込む完全なファイルパス。</param> public CsvBuilder(string path) : this(path, Encoding.Default) { } /// <summary> /// ファイル名、文字エンコーディングを指定して、 <see cref="CsvWriter">CsvWriter</see> クラスの新しいインスタンスを初期化します。 /// </summary> /// <param name="path">書き込む完全なファイルパス。</param> /// <param name="encoding">使用する文字エンコーディング。</param> public CsvBuilder(string path, Encoding encoding) { var stream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite); this.stream = new StreamWriter(stream, encoding); } /// <summary> /// 使用する文字エンコーディングを取得します。 /// </summary> public Encoding Encoding { get { return this.stream.Encoding; } } /// <summary> /// 現在のストリームで利用される改行文字列を取得または設定します。 /// </summary> public string NewLine { get { return this.stream.NewLine; } set { this.stream.NewLine = value; } } /// <summary> /// 現在のストリームオブジェクトと基になるストリームをとじます。 /// </summary> public void Close() { if (this.stream == null) { return; } this.stream.Close(); } /// <summary> /// CsvWriter で利用されているすべてのリソースを解放します。 /// </summary> public void Dispose() { if (this.stream == null) { return; } this.stream.Close(); this.stream.Dispose(); this.stream = null; } /// <summary> /// 現在のライターで使用したすべてのバッファーをクリアし、バッファー内のすべてのデータをストリームに書き込みます。 /// </summary> public void Flush() { this.stream.Flush(); } /// <summary> /// 現在のライターで使用したすべてのバッファーを非同期的にクリアし、ストリームへ書き込みます。 /// </summary> /// <returns>非同期のフラッシュ操作を表すタスク。</returns> public Task FlushAsync() { return this.stream.FlushAsync(); } /// <summary> /// ストリームに文字を書き込みます。 /// </summary> /// <typeparam name="T">リストの型。</typeparam> /// <param name="data">CSVデータ。</param> public void Write<T>(List<List<T>> data, string bankName, string extensiton) { SaveFileDialog sfd = new SaveFileDialog(); sfd.FileName = CreateDateTimeFileName(name, extension); sfd.InitialDirectory = @"C:\"; sfd.Title = "ファイルの保存先を指定してください。"; sfd.Filter = "csv files (*.csv)|*.csv"; if (sfd.ShowDialog() == DialogResult.OK) { foreach (var row in data) { this.WriteRow<T>(row); } } } /// <summary> /// ストリームに1レコード分の文字列を書き込みます。 /// </summary> /// <typeparam name="T">リストの型。</typeparam> /// <param name="row">CSVの1レコード。</param> public void WriteRow<T>(List<T> row) { var sb = new StringBuilder(); foreach(var cell in row) { var value = cell.ToString(); if (value.Contains(this.NewLine) || value.Contains(",") || value.Contains("\"")) { value = value.Replace("\"", "\"\""); sb.Append("\""); sb.Append(value); sb.Append("\""); } else { sb.Append(value); } sb.Append(","); } sb.Remove(sb.Length - 1, 1); this.stream.WriteLine(sb.ToString()); } /// <summary> /// ストリームに1レコード分の文字列を非同期的に書き込みます。 /// </summary> /// <typeparam name="T">リストの型。</typeparam> /// <param name="row">CSVの1レコード。</param> /// <returns>非同期の書き込み操作を表すタスク。</returns> public Task WriteRowAsync<T>(List<T> row) { return Task.Factory.StartNew(() => { this.WriteRow<T>(row); }); } /// <summary> /// 日付名のファイル名を返す /// </summary> /// <param name="extension">拡張子</param> /// <returns>拡張子を含んだ、日付のファイル名</returns> public static string CreateDateTimeFileName(string bankName, string extension) { return DateTime.Now.ToString("yyyyMMddhhmmss") + bankName + extension; } }

・ 使用する側のコードは下記のようなものです。

lang

using (var csvBuilder = new CsvBuilder(CsvBuilder.CreateDateTimeFileName("Name", ".csv"))) { csvBuilder.Write(list, "Name", ".csv"); }

動作環境

・.NET Frame Work 4.5
・Visual Studio2013

追加で…

Debugフォルダ下に作成されるCSVファイルは削除する処理を入れるべきものでしょうか?開発時の確認にはあった方が便利ですが、延々とたまっていくのをたまにまとめて削除という運用も微妙かと思っています。

よろしくお願いします。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

CSV

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

C#

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです