56296


c#初心者です。

string
ButtonBase.Textというデータ型のオブジェクト(1次元のリスト)を列方向にcsv出力したいのですが、StreamWriterを使うと行方向に出力されてしまいます。

オブジェクトの転置も考えましたがなかなかうまくいかず困っています。

列方向に（右に）出力できればなんでもいいのですが、どなたか解決できそうな方はいらっしゃいますか？

追記：回答ありがとうございます。String.Join
Methodを使って、カンマ区切りで文字列を連結してみましたが、やはり行方向（下）に出力されてしまいます。

下記が該当コードです。よろしければ、目を通していただけますか？昨日から初めてC#を使い始めたので、理解が追い付いていないまま書いているところもあります。ご了承ください。

[code]

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        // 指定した複数のグループ内のラジオボタンでチェックされている物を全部取り出す
        var RadioButtonCheckedAll_InGroups = new[] { groupBox3, groupBox4, groupBox6, groupBox8, groupBox10, groupBox11, groupBox12, groupBox13, }
        .SelectMany(g => g.Controls.OfType<RadioButton>()
        .Where(r => r.Checked));
    
        // 結果
        foreach (var rb in RadioButtonCheckedAll_InGroups ?? new RadioButton[0])
        {
    
            string tempString = String.Join(",",rb.Text);
    
            // ファイルを書き込みモード（上書き）で開く
            StreamWriter file = new StreamWriter("survey.csv", true, Encoding.UTF8);
            // ファイルに書き込む
            file.WriteLine(tempString);
            // ファイルを閉じる
            file.Close();
        }
    }
    
[/code]


CC BY-SA 4.0
2019-07-01T12:44:36.763
56294
2019-07-02T11:53:13.790
2019-07-02T07:08:25.920
34501
34501
question
c#
C#のCSV書き込みについて


最初にソースが提示されていれば、全然違う答えになっていましたね。

原因は`foreach`ループの中で処理しているからです。

ソースの`foreach`ループでは、RadioButtonコントロールが1個づつ選択されて処理されます。

そのため、その中でCSVを作成して`WriteLine`でファイルに書くと、1個につき1行書かれます。  
それでは、質問のように、行方向に出力されることになります。

`foreach`ループの前にstringのList変数を宣言・初期化しておき、`foreach`ループの中では、そのListにTextをAddしていく処理だけ行って、ループを抜けた後でCSVデータ作成とファイル書き込み処理を行うようにしましょう。

なお、最初のLINQを工夫すればコントロール配列ではなく、直接Textの配列が取得できるので、`foreach`ループは不要になります。合わせれば、以下のようになります。

[code]

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        // 指定した複数のグループ内のラジオボタンでチェックされている物のTextを全部取り出す
        var RadioButtonCheckedAll_InGroups = new[] { groupBox3, groupBox4, groupBox6, groupBox8, groupBox10, groupBox11, groupBox12, groupBox13, }
        .SelectMany(g => g.Controls.OfType<RadioButton>()
        .Where(r => r.Checked))
        .Select(b => b.Text);  // RadioButtonコントロールのTextプロパティだけ抜き出して配列化
    
        // 結果
        string tempString = String.Join(",", RadioButtonCheckedAll_InGroups);  // 1行のCSVに変換
        if (string.IsNullOrWhiteSpace(tempString))
        {
            return;
        }
    
        // ファイルを書き込みモード（追加）で開く
        StreamWriter file = new StreamWriter("survey.csv", true, Encoding.UTF8);
        // ファイルに書き込む
        file.WriteLine(tempString);
        // ファイルを閉じる
        file.Close();
    }
    
[/code]

* * *

**以下は追加前の内容に対する回答です**

該当の変数(ButtonBase.Text)が
オブジェクトの配列(Object[])、文字列の配列(string[])、string型を含むIEnumerableのリスト(List<T>)のいずれかならば、[String.Join
Method](https://docs.microsoft.com/ja-
jp/dotnet/api/system.string.join?view=netframework-4.8) で連結することができます。

以下のようになります。

[code]

    string tempString = String.Join(",", ButtonBase.Text);
    
[/code]

それぞれの要素をダブルクォーテーションで囲みたい場合は、以下のようになります。

[code]

    string tempString = String.Join(",", ButtonBase.Text.Select(s => "\"" + s + "\""));
    
[/code]

変換した文字列変数をStreamWriterで書き出せば良いでしょう。

CSVでもっと色々と汎用的なことをやりたいのならば、高機能のライブラリや事例等が多数ありますので検索してみてください。


CC BY-SA 4.0
2019-07-01T14:27:18.050
56296
2019-07-02T11:53:13.790
2019-07-02T11:53:13.790
26370
26370
56294
answer