在C#中以CSV形式转换单个数据行

M. *_*. X 2 .net c# csv

如何只使用少量C#命令将单个数据行(数据表)转换为类似CSV的字符串.换句话说,变成像"value_1; value_2; ...; value_n"这样的字符串

Adr*_*tti 9

一个单一的快速和脏DataRow:

System.Data.DataRow row = ...;

string csvLine = String.Join(
    CultureInfo.CurrentCulture.TextInfo.ListSeparator,
    row.ItemArray);
Run Code Online (Sandbox Code Playgroud)

如果您不关心特定于文化的分隔符,则可以执行以下操作来转换完整分隔符DataTable:

public static string ToCsv(System.Data.DataTable table)
{
    StringBuilder csv = new StringBuilder();

    foreach (DataRow row in table.Rows)
        csv.AppendLine(String.Join(";", row.ItemArray));

    return csv.ToString();
}
Run Code Online (Sandbox Code Playgroud)

这里有一个更复杂的例子,如果你需要处理一些值的格式化(如果它们不仅仅是数字).

public static string ToCsv(DataTable table)
{
    StringBuilder csv = new StringBuilder();

    foreach (DataRow row in table.Rows)
    {
        for (int i = 0; i < row.ItemArray.Length; ++i)
        {
            if (i > 0)
                csv.Append(CultureInfo.CurrentCulture.TextInfo.ListSeparator);

            csv.Append(FormatValue(row.ItemArray[i]));
        }

        csv.AppendLine();
    }

    return csv.ToString();
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢LINQ(并假设表不为空):

public static string ToCsv(DataTable table, string separator = null)
{
    if (separator == null)
        separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator;

    return table.Rows
        .Cast<DataRow>()
        .Select(r => String.Join(separator, r.ItemArray.Select(c => FormatValue(c)))
        .Aggregate(new StringBuilder(), (result, line) => result.AppendLine(line))
        .ToString();
}
Run Code Online (Sandbox Code Playgroud)

使用此私有函数格式化值.这是一个非常天真的实现,对于你应该使用的非原始类型TypeConverter(如果有的话,请参阅这个漂亮的库:通用类型转换器)并仅在需要时引用文本(2.6):

private static string FormatValue(object value)
{
    if (Object.ReferenceEquals(value, null))
        return "";

    Type valueType = value.GetType();

    if (valueType.IsPrimitive || valueType == typeof(DateTime))
        return value.ToString();

    return String.Format("\"{0}\"",
        value.ToString().Replace("\"", "\"\"");
}
Run Code Online (Sandbox Code Playgroud)

注意
即使存在用于CSVRFC,许多应用程序也不遵循其规则,并且它们以自己的方式处理特殊情况(例如,Microsoft Excel使用区域设置列表分隔符而不是逗号,并且它不处理字符串中的换行符按照标准的要求).


Guf*_*ffa 5

这是一个开始:

StringBuilder line = new StringBuilder();
bool first = true;
foreach (object o in theDataRow.ItemArray) {
  string s = o.Tostring();
  if (s.Contains("\"") || s.Contains(",")) {
    s = "\"" + s.Replace("\"", "\"\"") + "\"";
  }
  if (first) {
    first = false;
  } else {
    line.Adppend(',');
  }
  line.Append(s);
}
String csv = line.ToString();
Run Code Online (Sandbox Code Playgroud)

它将处理包含分隔符的引用值和值,即包含引号的值或分隔符需要用引号括起来,并且其中的引号需要通过加倍来转义.

请注意,代码使用逗号作为分隔符,因为这是CSV中的C代表的含义.有些程序使用分号可能会更舒服.

改进的空间:还有其他字符应该触发引用,如填充空格和换行符.

注意:即使现在为CSV文件定义了标准,也很少遵循,因为很多程序是在标准存在之前很久就开发的.您只需要适应您需要与之通信的任何程序的特性.