在 C# 中转换 CSV 字符串中的单个数据行
本文关键字:单个 数据 CSV 转换 字符串 | 更新日期: 2023-09-27 18:37:12
如何仅使用几个 C# 命令将(数据表的)单个数据行转换为类似 CSV 的字符串。换句话说,变成一个字符串,如"value_1;value_2;...;value_n"
快速而肮脏的单个DataRow
:
System.Data.DataRow row = ...;
string csvLine = String.Join(
CultureInfo.CurrentCulture.TextInfo.ListSeparator,
row.ItemArray);
如果您不关心特定于区域性的分隔符,则可以执行此操作以转换完整的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();
}
这里有一个更复杂的例子,如果你需要处理一些值的格式设置(以防它们不仅仅是数字)。
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();
}
或者,如果您更喜欢 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();
}
使用此私有函数设置值的格式。这是一个非常幼稚的实现,对于非基元类型,您应该使用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("'"", "'"'"");
}
笔记
即使有 CSV 的 RFC,许多应用程序也不遵循其规则,它们以自己的方式处理特殊情况(例如,Microsoft Excel 使用区域设置列表分隔符而不是逗号,并且它不按照标准的要求处理字符串中的换行符)。
这是一个开始:
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();
它将处理带引号的值和包含分隔符的值,即包含引号或分隔符的值需要用引号括起来,并且其中的引号需要通过加倍来转义。
请注意,代码使用逗号作为分隔符,因为这就是 CSV 中的 C 所代表的。某些程序可能更习惯使用分号。
改进空间:还有其他字符应该触发引用,例如填充空格和换行符。
注意:即使现在为CSV文件定义了标准,也很少遵循,因为许多程序早在该标准存在之前就已经开发出来了。您只需要适应需要与之通信的任何程序的特殊性。