Я не думаю, что мой вопрос дублируется, потому что я не спрашиваю, как конвертировать списки в 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
?
Я абсолютно согласен с вами! Тем не менее, я думаю, что это хороший шанс узнать больше о кодировании на C# и LinQ!
Если это ваша цель здесь, то это совершенно нормально, конечно.
Используйте информацию о свойствах для этой цели.
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)
.
CSV — это значения, разделенные запятыми, но разделитель основан на системном разделителе по умолчанию! Используйте системный разделитель для столбцов и используйте конечную строку для строк.
вы можете найти свою систему по умолчанию следующим образом:
Открыть панель управления
открытые часы и регион
Нажмите на дополнительные настройки
Вы можете увидеть и изменить системный разделитель по умолчанию
Если я хочу изменить разделитель, я могу просто изменить его в своих кодах. В этом случае я хочу сохранить запятую в качестве разделителя.
Использование библиотеки CSV значительно упростит вашу работу. Именно это несколько раз решали люди умнее нас с вами вместе взятых. Они широко тестируются и используются в полевых условиях. Да, нам не нравятся сторонние зависимости. Но иногда лучше стоять на плечах гигантов.