Список С#: добавьте двойные кавычки, когда поле является строкой с LinQ

Я не думаю, что мой вопрос дублируется, потому что я не спрашиваю, как конвертировать списки в 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);
    ...
}

Как изменить статус LinQ, чтобы добавить двойные кавычки в начало и конец строки, когда это System.String?

Использование библиотеки CSV значительно упростит вашу работу. Именно это несколько раз решали люди умнее нас с вами вместе взятых. Они широко тестируются и используются в полевых условиях. Да, нам не нравятся сторонние зависимости. Но иногда лучше стоять на плечах гигантов.

Fildor 18.11.2022 08:30

Я абсолютно согласен с вами! Тем не менее, я думаю, что это хороший шанс узнать больше о кодировании на C# и LinQ!

AsM 18.11.2022 09:59

Если это ваша цель здесь, то это совершенно нормально, конечно.

Fildor 18.11.2022 10:43
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
3
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте информацию о свойствах для этой цели.

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);
    ...
}

Спасибо Саша! Он работает отлично! Кроме того, мы можем изменить содержимое файла if. Если поле содержит запятые и точки с запятой, мы можем клонировать объект в строку и вернуть property.GetValue(row, null).

AsM 18.11.2022 09:57

CSV — это значения, разделенные запятыми, но разделитель основан на системном разделителе по умолчанию! Используйте системный разделитель для столбцов и используйте конечную строку для строк.

вы можете найти свою систему по умолчанию следующим образом:

Открыть панель управления

открытые часы и регион

Нажмите на дополнительные настройки

Вы можете увидеть и изменить системный разделитель по умолчанию

Если я хочу изменить разделитель, я могу просто изменить его в своих кодах. В этом случае я хочу сохранить запятую в качестве разделителя.

AsM 18.11.2022 09:59

Другие вопросы по теме