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

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

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

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

C#

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

Q&A

解決済

2回答

4825閲覧

CsvHelperを利用したCSV出力時に、任意の列にダブルクォートを付与したい

cha-ra

総合スコア40

CSV

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

C#

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

0グッド

0クリップ

投稿2017/10/25 06:45

編集2017/10/26 01:01

CsvHelper を利用してCSV出力処理を作成しています。

この出力時に、文字列の場合のみダブルクォートを付けて出力したいのですが、上手くいきません。
半角スペース、カンマ、改行コード等が入っている場合にのみダブルクォートが付与される状況です。

出力するプロパティの型がstringの場合に付与出来るのが理想ですが、
何か方法はありませんでしょうか?

または、CsvHelper.Configuration.QuoteAllFields に true を設定したうえで、
任意の列のみダブルクォートを外す方法がありますか?


###追記
力技として、出力文字列の前後にダブルクォートを付与することで、
3連続のダブルクォート「"""」を出力し、
出来上がったファイルを開いて一括置換するという方法を取れますが、
できれば一回の出力で綺麗に作成したいと思っています。。。

###追記2
コメントへの返信ではMarkDownが利用できなかったので、
修正後のコードをこちらに追記します。

c#

1// データ出力部 2using (var sw = new StreamWriter(path, false, System.Text.Encoding.GetEncoding("shift_jis"))) 3using (var csv = new CsvHelper.CsvWriter(sw)) { 4 csv.Configuration.RegisterClassMap(mapper); 5 csv.Configuration.HasHeaderRecord = false; 6 7 csv.Configuration.QuoteAllFields = false; 8 csv.Configuration.QuoteNoFields = true; 9 10 foreach (var data in dataList) { 11 csv.WriteRecord(data); 12 } 13} 14 15// StringConverter実装クラス 16public class AddQuoteConverter : CsvHelper.TypeConversion.StringConverter { 17 public override string ConvertToString(TypeConverterOptions options, object value) { 18 return @"""" + base.ConvertToString(options, value) + @""""; 19 } 20}

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

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

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

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

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

guest

回答2

0

ベストアンサー

CSVHelper 4.0.2 になっていたんですね。
(それを前提に書いていきます)

C#

1 Map(x => x.なにか).TypeConverter<CsvDoubleQuoteConverter>(); 2 3 public class CsvDoubleQuoteConverter : CsvHelper.TypeConversion.StringConverter 4 { 5 public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) 6 { 7 row.Configuration.QuoteAllFields = true; 8 row.Configuration.QuoteNoFields = false; 9 string quoteStr = @"""" + base.ConvertToString(value, row, memberMapData) + @""""; 10 row.Configuration.QuoteAllFields = false; 11 row.Configuration.QuoteNoFields = true; 12 return quoteStr; 13 } 14 } 15 16

QuoteAllFieldsとQuoteNoFieldsは相反する設定をしなければならないようです。

(参照URLを見てください)

参考になれば幸いです。

投稿2017/10/25 09:57

283cks

総合スコア138

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

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

cha-ra

2017/10/26 01:02 編集

回答ありがとうございます。 当方のバージョンは4.0.3なせいか同様のoverrideは出来ませんでしたが、 実装箇所が違うだけで実現出来るようになりました。 とても助かりました! ※修正後ソースはTopに追記しました。
283cks

2017/10/26 02:13

実装できてなによりです。 CsvHelperは本日付で4.0.3にアップされましたね。
guest

0

回答ではありません。

プロパティを弄って。。というわけにはいかないようです。
Option: always quote only string fields #693

Mapを使っているのならStringConverter で対応できるみたいですが。

投稿2017/10/25 09:08

編集2017/10/25 09:10
ebiryo

総合スコア797

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問