3

DataTable を CSV ファイルに変換するコードを採用しました。実際のデータでコンマが使用されている場合を除いて、うまく機能しているようです。その場合、コンマを表示する方法はありますか? これは私がやったことです:

StringBuilder sb = new StringBuilder();

IEnumerable<string> columnNames = dtResults.Columns
                                           .Cast<DataColumn>()
                                           .Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));

foreach (DataRow row in dtResults.Rows)
{
    IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
    sb.AppendLine(string.Join(",", fields));
}

File.WriteAllText(saveFileDialog.FileName, sb.ToString());
4

2 に答える 2

7

フィールドにコンマが含まれる場合は、二重 (または一重) 引用符で囲む必要があります。

FileHelpers ライブラリを使用して CSV ファイルを作成できます。適切にエスケープする必要があります。

ライブラリを使用したくない場合の重要な点は次のとおりです。カンマがある場合は、フィールドを引用符で囲む必要があります。

ID, NAME
1, "Doe, John"
2, 'Doe, Jane'

フィールドに引用符が含まれている場合は、追加の引用符でエスケープする必要があります。

3, "Anakin ""Darth Vader"", Skywalker"
4, 'O''Connor, Sinead'

考えられる解決策:

static string CsvEscape(this string value) {
    if (value.Contains(",")) {
        return "\"" + value.Replace("\"", "\"\"") + "\"";
    }
    return value;
}

そして、あなたのコードで:

IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString().CsvEscape());

PS:ウィキペディアによると、実際の csv 仕様はありませんが、RFC 4180にはよく使用される形式が記載されています。

于 2013-02-18T14:00:22.847 に答える
0

私はあなたを助ける以下の修正されたコードを公開しました。

StringBuilder sb = new StringBuilder();

            string[] val =  { "ramesh","suresh, Ganesh" };
            IEnumerable<string> columnNames = val;

            IList<string> objFinal = new List<string>();
            foreach (string v in columnNames)
            {
                string temp = v;
                if (temp.Contains(","))
                    temp = "\"" + v + "\"";

                objFinal.Add(temp);
            }
            sb.AppendLine(string.Join(",", objFinal.AsEnumerable<string>()));

            }            

CSV は、ダブル コード間のデータでコンマをサポートします。

以下の1行のコードを使用して、シングルショットでダブルコードとコンマを追加できます

IEnumerable<string> columnNames = dtResults.Columns
                                           .Cast<DataColumn>()
                                           .Select(column => column.ColumnName);

var res = columnNames.Aggregate((current, next) => "\"" + current + "\"" + ", " + "\"" + next + "\"");


File.WriteAllText(saveFileDialog.FileName, res.ToString());
于 2013-02-18T14:32:57.890 に答える