如何修改C# LinQ语句为List转CSV时的string字段添加双引号
问题描述
我认为我的问题并非重复提问,我并非询问如何将List转换为CSV,而是在将List转换为逗号分隔的CSV文件时,遇到部分字段包含逗号和分号的情况,导致单个列被拆分为至少两列。
我的代码:
public void SaveToCsv<T>(List<T> listToBeConverted) { var lines = new List<string>(); IEnumerable<PropertyDescriptor> props = TypeDescriptor.GetProperties(typeof(T)).OfType<PropertyDescriptor>(); //Get headers var header = string.Join(",", props.ToList().Select(x => x.Name)); //Add all headers lines.Add(header); //LinQ to get all row data and add commas to serperate them var valueLines = listToBeConverted.Select(row => string.Join(",", header.Split(',').Select(a => row.GetType().GetProperty(a).GetValue(row, null)))); //add row data to List lines.AddRange(valueLines); ... }
请问如何修改上述LinQ语句,为System.String类型的字段首尾添加双引号?
解决方案
直接修改LinQ部分,判断属性值类型是否为字符串,若是则用双引号包裹,同时要转义字符串内部的双引号(CSV标准规则),避免解析出错。另外建议直接复用之前的props集合,不用通过表头拆分再取属性,更高效稳妥。
修改后的代码如下:
var valueLines = listToBeConverted.Select(row => string.Join(",", props.Select(prop => { var value = prop.GetValue(row); if (value is string strValue) { // 转义内部双引号后包裹双引号 return $"\"{strValue.Replace("\"", "\"\"")}\""; } // 非字符串类型直接转字符串输出,空值处理为空字符串 return value?.ToString() ?? string.Empty; }) ));
补充说明:
- 对字符串字段,用
Replace("\"", "\"\"")转义内部双引号是CSV的标准要求,否则解析时会识别错误 - 双引号包裹后,即使字段内容包含逗号、分号,CSV解析器也会将其视为单个列的内容
内容的提问来源于stack exchange,提问作者AsM
相关产品推荐
相关产品推荐

