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

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

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

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

Q&A

1回答

473閲覧

C# CSVの書き込みについて

yunagixxxx

総合スコア18

C#

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

0グッド

0クリップ

投稿2024/09/09 07:34

実現したいこと

WindowsFormでテキストボックスに入力した内容をCSVに書き込みを行う処理をしています。
テキストボックスが1行タイプで1行であればCSVもエクセルで開いた時に1つのセルに1つのデータとしてきちんと書き込みが行われています。
ですが、テキストボックスが複数行タイプで、複数行入力した後に書き込みを行おうとすると、エクセルでいうと、1つのデータとして書き込みされず1行ごとに改行されたセルに書き込みがされてしまいます。

例えばテキストボックスに
AAA
BBB
と入力されていたら、1つのデータとして書き込みされるようにしたいのですが、方法を見つけられませんでした。

どのようにすればいいかご存じの方がいましたら、教えて頂けると助かります。
よろしくお願いいたします。

下記のコードは実際使っているものとは少し異なりますが、このような感じで書き込んでいます。

該当のソースコード

string sdata; for (int i = 0; i < 5; i++) { string[] str = { i, //No TextBox.Text, //テキストボックス }; } sdata = string.Join(",", str); sw.WriteLine(sdata); sw.Close();

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

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

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

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

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

YAmaGNZ

2024/09/09 07:39

CSVは改行されると別のデータとして扱われるのは理解されていますか? もし改行を含むデータを扱いたいのであればダブルコーテーションで囲むとよろしいかと思います。
yunagixxxx

2024/09/09 07:54

改行されると別のデータとして扱われるのは理解しております。 なので、改行コードなりも含めてCSVに書き込みたいと思っています。 テキストボックス(TextBox.Text)に AAA BBB と入力されていた場合、どの部分をダブルクォーテーションで囲めばいいのでしょうか。 自分でも考えてみたんですが、分からずお教えいただければ幸いです。 よろしくお願いいたします。
YAmaGNZ

2024/09/09 08:06 編集

「CSV 改行」などで検索するといろいろと情報が出てくるかと思います。 基本的にダブルコーテーションで囲むとその中の物が1つのデータとして扱われます。 123,"456 789",ABC とあった場合 123 と 456 789 と ABC という3つのデータになります。
hqf00342

2024/09/09 08:51

Excelを使って自分が欲しい形を作ってみて、 「CSV形式で保存」しファイルを確認してみたらいかがでしょうか。
guest

回答1

0

テキストボックスが1行タイプで1行であればCSVもエクセルで開いた時に1つのセルに1つのデータとしてきちんと書き込みが行われています。

(今の実装では)カンマが入力されると、別のセルに分かれてしまう(かエラーになる)と思います。

どのようにすればいいかご存じの方がいましたら、教えて頂けると助かります。

文字列の前後にダブルクォーテーションを付けてください。
その際文字列中にダブルクォーテーションが入っていれば、""になるように先に置換してください。
Comma-Separated Values - Wikipedia

指定がないので.NET8です(希望があれば合わせます)
手元にExcelがないので読み込めるかは未確認です。

cs

1using System.Diagnostics; 2using System.Text; 3 4namespace Qlzqda3u9obw4gl; 5 6public partial class Form1 : Form 7{ 8 public Form1() 9 { 10 InitializeComponent(); 11 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 12 } 13 14 private void Button1_Click(object sender, EventArgs e) 15 { 16 using (var sw = new StreamWriter("test.csv", false, Encoding.GetEncoding("Shift_JIS"))) 17 { 18 sw.WriteLine("No,項目"); 19 20 var textBoxes = Controls.OfType<TextBox>().OrderBy(x => x.Name); 21 foreach (var (textBox, i) in textBoxes.Select((x, i) => (x, i))) 22 { 23 var text = textBox.Text; 24 25 // 文字列中のダブルクォーテーションを2つ並べてエスケープ(「A"B」だったら「A""B」にする) 26 text = text.Replace("\"", "\"\"", StringComparison.Ordinal); 27 28 // 文字列の前後にダブルクォーテーションを付ける 29 text = $"\"{text}\""; 30 31 string[] str = { $"{i}", text, }; 32 string sdata = string.Join(",", str); 33 sw.WriteLine(sdata); 34 } 35 } 36 37 Process.Start(new ProcessStartInfo 38 { 39 FileName = "notepad", 40 Arguments = "test.csv", 41 UseShellExecute = true, 42 }); 43 } 44}

アプリ動画


追記 .NET Framework4.8

cs

1using System; 2using System.Data; 3using System.Diagnostics; 4using System.IO; 5using System.Linq; 6using System.Text; 7using System.Windows.Forms; 8 9namespace Qlzqda3u9obw4gl 10{ 11 public partial class Form1 : Form 12 { 13 public Form1() 14 { 15 InitializeComponent(); 16 } 17 18 private void Button1_Click(object sender, EventArgs e) 19 { 20 using (StreamWriter sw = new StreamWriter("test.csv", false, Encoding.GetEncoding("Shift_JIS"))) 21 { 22 sw.WriteLine("No,項目"); 23 24 var textBoxes = Controls.OfType<TextBox>().OrderBy(x => x.Name); // この辺は実際と違うだろうのであまり気になさらず^^; 25 foreach (var (textBox, i) in textBoxes.Select((x, i) => (x, i))) 26 { 27 string text = textBox.Text; 28 29 // 文字列中のダブルクォーテーションを2つ並べてエスケープ(「A"B」だったら「A""B」にする) 30 //text = text.Replace("\"", "\"\""); 31 text = text.Replace(new string('"', 1), new string('"', 2)); // こうのほうが分かりやすいか?? 32 33 // 文字列の前後にダブルクォーテーションを付ける 34 //text = $"\"{text}\""; 35 text = '"' + text + '"'; // これが分かりやすいか 36 37 //string[] str = { $"{i}", text, }; 38 string[] str = { i.ToString(), text, }; // ここもか? 39 string sdata = string.Join(",", str); 40 sw.WriteLine(sdata); 41 } 42 } 43 44 // ここもあまり気になさらず^^; 45 Process.Start(new ProcessStartInfo 46 { 47 FileName = "notepad", 48 Arguments = "test.csv", 49 UseShellExecute = true, 50 }); 51 } 52 } 53}

投稿2024/09/10 15:51

編集2024/09/11 09:43
TN8001

総合スコア9713

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

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

yunagixxxx

2024/09/11 07:44

とても詳しくgif画像までつけていただきありがとうございます。 こちら参考にして、ひとまず自分の他のやりたいことと組み合わせてみようと思ったのですが、 text = text.Replace("\"", "\"\"", StringComparison.Ordinal); の部分で「引数3を指定するメソッド’Replace'のオーバーロードはありません」と表示されます。 ここはどのようにしたらよろしいのでしょうか。 お時間のある時にでもお教えいただければ幸いです。 よろしくお願いいたします。
TN8001

2024/09/11 09:00 編集

> ここはどのようにしたらよろしいのでしょうか。 そこがエラーになるということは、.NET Frameworkでしょうかね? [String.Replace メソッド (System) | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/api/system.string.replace) text = text.Replace("\"", "\"\""); のように単純に消しちゃってください。 大して差分もないですが.NET Framework版も追記しました。
yunagixxxx

2024/09/12 07:58

ありがとうございます! 少しお時間いただくかもしれないんですが、教えていただいた通りに試してみます。 もしかしたら、追加で質問させていただくかもしれませんが、その時はすみませんがよろしくお願いいたします。 ご丁寧に本当にありがとうございます。
TN8001

2024/09/12 08:06

こちらは急がないのでごゆっくりどうぞ^^ 確認が取れてから「解決済」にしてください。 回答コードの不明点や疑問点は遠慮なくコメントしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問