72815


datagridviewに表示中のデータをcsvファイルとして出力する際にダブルクォーテーション内にカンマがある行のみズレてしまっています。当初読み込み時に処理すると思っていたのですが、書込み時に行う方が適切ということだったのですが、datagridview1に表示してあるデータをダブルクォーテーションで囲う方法がわかりませんでした。ので教えていただきたいです。

取り込み時csvの例

[code]

    あ,あい,あ
    あ,"あ,い",あ
    
[/code]

出力時csvの例(この形に書き直したい)

[code]

    "あ","あ","あ","あ","あ"
    "あ,い","あ,い,う","い","う","え,あ"
    
[/code]

読み込み時のコード

[code]

    using (TextFieldParser parser = new TextFieldParser(csvFilePath, encoding))
    {
        //カンマ区切りのcsv形式にする
        parser.TextFieldType = FieldType.Delimited;
        parser.Delimiters = new string[] { "," };
    
        //最後まで繰り返す
        while (!parser.EndOfData)
        {
            parser.HasFieldsEnclosedInQuotes = true;
    
            parser.TrimWhiteSpace = false;
    
            //フィールド作成
            string[] fields = parser.ReadFields();
    
[/code]

書込みコード

[code]

    using (StreamWriter writer = new StreamWriter(DESKTOP + "\\" +DateTime.Today.ToString("yyyy/MM/dd").Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty)+".csv", false, Encoding.GetEncoding("shift_jis")))
    {
    
        int i;
        int Columns = dataGridView1.Columns.Count;
        int rows = dataGridView1.Rows.Count;
        List<string> strList;
        strList = new List<string>();
    
        for (int c = 0; c < Columns; c++)
        {
            strList.Add(dataGridView1.Columns[c].HeaderCell.FormattedValue.ToString());
        }
        //配列変換
        string[] strHeader = strList.ToArray();
        //csv変換
    
        string strCsvData2 = string.Join(",", strHeader);
        writer.WriteLine(strCsvData2);
    
        for (i = 0; i < rows; i++)
        {
            strList = new List<string>();
    
            for (int j = 0; j < Columns; j++)
            {
                strList.Add(dataGridView1[j, i].FormattedValue.ToString());
            }
            string[] strArray = strList.ToArray();
            string strCsvData = string.Join(",", strArray);
    
            writer.WriteLine(strCsvData);
        }
    
    }
    
[/code]


CC BY-SA 4.0
2020-12-21T04:47:18.650
72782
2020-12-22T03:44:38.117
2020-12-22T02:17:49.703
3060
42419
question
c# csv linq datagridview
ダブルクォーテーション内にカンマ入りのcsvファイルを出力したい


[参考ページ](https://dobon.net/vb/dotnet/file/writecsvfile.html)
のコメント文にもある通り、`EncloseDoubleQuotesIfNeed`は '必要ならば、文字列をダブルクォートで囲む' 処理です。  
引数に元文字列を取り、返り値として（必要ならば）囲んだ結果を返します。

一方質問文提示コードでは

[code]

            for (int j = 0; j < Columns; j++)
            {
                strList.Add(dataGridView1[j, i].FormattedValue.ToString());
    //                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 一要素に格納したい文字列
            }
            string[] strArray = strList.ToArray();
            string strCsvData = string.Join(",", strArray); // , で連結
    
[/code]

の部分でcsvの行に変換しているので、一要素に格納したい文字列格納したい文字列を変換関数に渡せばよいはずです。

[code]

            for (int j = 0; j < Columns; j++)
            {
                string item = dataGridView1[j, i].FormattedValue.ToString(); // あ,い
                string convertedItem = EncloseDoubleQuotesIfNeed(item);      // "あ,い"
                strList.Add(convertedItem);
            }
            string[] strArray = strList.ToArray();
            string strCsvData = string.Join(",", strArray); // あ,"あ,い",あ
    
[/code]

* * *

質問文だとすべての要素を囲みたい、という風になっていますが、この変換関数は必要なものだけを囲みます。  
すべて囲むには`string convertedItem = EncloseDoubleQuotesIfNeed(item);`の部分を調整してください


CC BY-SA 4.0
2020-12-22T03:44:38.117
72815
2020-12-22T03:44:38.117
20885
72782
answer