テキストボックスが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}