.net C# List:使用LinQ [duplicate]在字段为字符串时添加双引号

pgvzfuti  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(166)

此问题在此处已有答案

Writing data into CSV file in C#(15个答案)
8小时前关门。
我不认为我的问题是重复的,因为我不是问如何将列表转换为CSV。但是:
我正在尝试将列表转换为逗号分隔的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);
    ...
}

当字符串为System.String时,如何修改LinQ语句,在字符串的开头和结尾添加双引号?

htrmnn0y

htrmnn0y1#

使用属性信息可实现此目的。

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(",", props.Select(x =>
    {
        var property = row.GetType().GetProperty(x.Name);
        if (property.PropertyType == typeof(string))
            return $"\"{property.GetValue(row, null)}\"";
        return property.GetValue(row, null);
    })));
    //add row data to List
    lines.AddRange(valueLines);
    ...
}
kognpnkq

kognpnkq2#

CSV为逗号分隔值,但分隔符基于您的默认系统分隔符!对列使用系统分隔符,对行使用结束行。
您可以通过以下方式找到系统默认值:
打开控制面板

开放时钟和区域

单击“附加设置”

您可以查看和更改系统的默认分隔符

相关问题