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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

3回答

11099閲覧

C#のStreamWriterでCSV出力したときセル内改行がうまくいかない。

DISK131

総合スコア1

C#

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2021/05/19 00:30

編集2021/05/19 01:17

前提・実現したいこと

C#.NETでSQLのデータベースをCSV出力したいのですが、StreamWriterで出力したときセル内改行がうまくいかず普通に改行されてしまいます。
例えばデータベース上では複数行あるデータは"あいうえお\r\nかきくけこ"と格納されています。それをそのままStreamWriterでcsv出力した場合"かきくけこ"は次のデータで改行されてしまいます。
StreamWriterでもセル内改行はどうすればうまくいくでしょうか?

エクセルで出力したときはセル内改行はうまくいくのですが、DateTime型の出力がうまくいきません。
2021/05/19 9:10:00で保存した場合、CSVでは05/19/2021 9:10:00と保存されてしまいます。
左寄せで保存されているし、エクセルで書式を"YYYY/MM/DD HH:MM:SS"とかに変えても変わらないので文字列として保存されてしまうのかなと。

C#

1//どちらも文字列で保存されてしまう? 2xlApp.Cells[1, 1] = dtr.GetValue(i); //中身DateTime型 3xlApp.Cells[1, 1] = DateTime.Now;

できれば始めに書いたStreamWriterのセル内改行の方を解決してStreamWriterで出力できるようにしたいです。
エクセルの出力使うと重すぎるので。。。

試したこと

改行コード\r\nの部分を置換してみました。
Environment.NewLineや\nなどあと、Encodingをutf-8、Shift_JISに変えてみたりも試しましたが無理でした。

該当のソースコード

C#

1StreamWriter sw = new StreamWriter(filepass, false, Encoding.GetEncoding("Shift_JIS"));//Shift_JIS or utf-8 2sw.WriteLine("あいうえお\r\nかきくけこ"); 3sw.WriteLine("あいうえお\rかきくけこ"); 4sw.WriteLine("あいうえお\nかきくけこ"); 5sw.WriteLine("あいうえお" + Environment.NewLine + "かきくけこ"); 6//どれもセル内改行できず普通に改行してしまう。

動作環境

OS windows10
VisualStudio2013
.NET Framework4.8
SQLはMySQLです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/19 00:46

開発環境(OS, Visual Studio のバージョン、.NET Framework か Core のどっちなのかとそのバージョンなど)を書いてください。 > C#.NETでSQLのデータベースをCSV出力したいのですが SQL って何ですか? SQL Server のことですか? それからどのようにデータを取得しているのかを書いてください。
DISK131

2021/05/19 01:13

OS windows10 VisualStudio2013 .NET Framework4.8 SQLはMySQLです。
退会済みユーザー

退会済みユーザー

2021/05/21 07:41 編集

既にいくつか回答がついていますが、問題は解決したのでしょうか?まだ解決していないのであれば、回答に対して試した内容や結果等のコメントを書いてください。解決したのであれば、ベストアンサーを選んで質問をクローズしてください。放置は失礼ですよ。
guest

回答3

0

一旦 MySQL のデータを DataTable に読み込んで、それから CSV ファイルを生成してはいかがですか?

具体例は以下の記事のサンプルコードの中の SaveDataTableAsCsv メソッドと EncloseByDoubleQuote メソッドを見てください。

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

MySQL ⇒ DataTable、DataTable ⇒ CSV への変換はググれば参考になる記事が多々ヒットすると思いますので自分でも調べてみてください。

投稿2021/05/19 01:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

フィールドデータ内に改行を含む場合はダブルクォートで囲まなくてはなりません。
RFC4180の2.6を参照してください。

投稿2021/05/19 01:12

YAmaGNZ

総合スコア10489

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

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

DISK131

2021/05/19 02:01

```C# sw.WriteLine("あいうえお\r\nかきくけこ"); ``` ダブルクォート内で文字+改行コード+文字ということではなくてですか?
YAmaGNZ

2021/05/19 02:12

それは、C#の文法上の文字列を記述する際のダブルクォートです。 sw.WriteLine("\"あいうえお\r\nかきくけこ\""); と出力される文字列が あいうえお かきくけこ ではなく "あいうえお かきくけこ" となるようにしてください。
guest

0

StreamWriterでもセル内改行はどうすればうまくいくでしょうか?
エクセルで出力したときはセル内改行はうまくいくのですが、DateTime型の出力がうまくいきません。

DateTime型の件はタイトルと関係無さそうなのでとりあえず無視しますが、Excelで読み込んだ時にセル内改行した状態にしたいのであれば、実際にセル内改行したExcelで出力したCSVデータの中身を確認すればすぐ判る事だと思いますが。
一応Excelで出力してみたところ、ダブルクォートで括っているだけです。
("かきくけこ<LF>さしすせそ" が1セルで表示される。<CR><LF>に変えてみても読み込みは問題無し)

csv

1あいうえお,"かきくけこ 2さしすせそ",たちつてと

自力でダブルクォート処理するのが面倒な場合は、Nugetで既存のCSVライブラリをダウンロードして活用した方がよいでしょう。下記は CSVHelper を使用した例です。

C#

1using CsvHelper; 2using System.Collections.Generic; 3using System.Dynamic; 4using System.Globalization; 5using System.IO; 6using System.Text; 7 8namespace Test 9{ 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 //手抜きしてdynamic型を使う 15 //データ形式が判っているなら、専用クラスを定義した方がよい 16 var records = new List<dynamic>(); 17 for (var i = 1; i <= 3; i++) 18 { 19 dynamic obj = new ExpandoObject(); 20 obj.Id = i; 21 obj.Col1 = "あいうえお"; 22 obj.Col2 = "かきくけこ\r\nさしすせそ"; 23 obj.Col3 = "たちつてと"; 24 records.Add(obj); 25 } 26 27 // .NET Core の場合、Shift_JIS を扱う場合はEncoding.RegisterProviderが必要 28 // (.NET Frameworkは不要) 29 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 30 31 // CSVファイルにShift_JISで出力 32 using (var writer = new StreamWriter(@"c:\test\test.csv", false, Encoding.GetEncoding("Shift_JIS"))) 33 using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) 34 { 35 csv.WriteRecords(records); 36 } 37 } 38 } 39} 40 41(出力結果) 42Id,Col1,Col2,Col3 431,あいうえお,"かきくけこ 44さしすせそ",たちつてと 452,あいうえお,"かきくけこ 46さしすせそ",たちつてと 473,あいうえお,"かきくけこ 48さしすせそ",たちつてと

投稿2021/05/19 00:55

編集2021/05/19 05:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問