Как экспортировать CSV без использования какого-либо пакета в C# (NET Core)?

Как создать хорошо структурированный файл CSV без использования каких-либо пакетов в ядре .NET.

И используйте ключи класса в качестве заголовка.

    public class TestArray
    {
        public string LastName{ get; set; }
        public string FirstName { get; set; }
        public string Age { get; set; }
        public string MoNumber { get; set; }
    }

Я пробовал с пакетом CsvHelper, все работает отлично, но я хочу экспортировать CSV-файл без использования каких-либо пакетов.

CsvHelper — это пакет с открытым исходным кодом. Посмотрите, как они это сделали. Очевидно, это не практический вопрос (в реальном сценарии вы бы использовали пакет). А если для вашего образования - то в чем именно вопрос?

Felix 18.04.2024 07:06

@Felix Я хочу экспортировать файл Csv без использования каких-либо пакетов, потому что, если я использую CsvHelper, он перезапишет некоторую версию пакета, и я не смогу использовать его должным образом. вот почему мне нужно что-то экспортное в формате CSV без использования каких-либо пакетов.

Ashish Prajapati 18.04.2024 07:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
184
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуй это:

Шаг 1. Создайте свой класс данных

Вы уже определили класс TestArray. Однако возможна опечатка или проблема с типом свойства для MoNumber. Предполагая, что это строка или что-то подобное, обозначающее номер мобильного телефона, я исправлю это здесь:

public class TestArray
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Age { get; set; }
    public string MoNumber { get; set; }  // Assuming this should be a string.
}

Шаг 2. Создайте метод для записи данных в CSV

Ниже приведен метод записи списка объектов TestArray в файл CSV:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;

public class CsvExporter
{
    public static void WriteCsv<T>(IEnumerable<T> items, string path)
    {
        Type itemType = typeof(T);
        var props = itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                            .Where(pi => pi.PropertyType == typeof(string) || pi.PropertyType == typeof(bool) || pi.PropertyType.IsPrimitive)
                            .ToArray();

        using (var writer = new StreamWriter(path))
        {
            // Writing header (property names)
            writer.WriteLine(string.Join(",", props.Select(p => p.Name)));

            // Writing data
            foreach (var item in items)
            {
                writer.WriteLine(string.Join(",", props.Select(p => GetValue(p, item))));
            }
        }
    }

    private static string GetValue(PropertyInfo propertyInfo, object obj)
    {
        var value = propertyInfo.GetValue(obj, null);
        return value?.ToString().Replace(",", ";");  // Escape commas in data
    }
}

Шаг 3: Использование метода

Теперь вы можете использовать этот метод для создания файла CSV. Вот пример использования этого метода:

public class Program
{
    static void Main(string[] args)
    {
        List<TestArray> list = new List<TestArray>
        {
            new TestArray { LastName = "Smith", FirstName = "John", Age = "30", MoNumber = "9876543210" },
            new TestArray { LastName = "Doe", FirstName = "Jane", Age = "25", MoNumber = "1234567890" }
        };

        CsvExporter.WriteCsv(list, "test.csv");
        Console.WriteLine("CSV file has been written.");
    }
}

Примечания:

  • Убедитесь, что ваши свойства представляют собой простые типы, которые можно преобразовать непосредственно в строку. Если у вас сложные типы или вам нужно специальное форматирование, возможно, вам придется соответствующим образом настроить метод GetValue.
  • В этом примере обрабатываются базовые сценарии записи CSV. Если у вас есть требования к специальным символам, многострочным значениям или другим сложностям CSV, вам может потребоваться расширить логику для правильной обработки таких случаев.

Вы можете использовать Reflection для написания общей функции ExportCsv:

using System.Text;

var testList = new List<TestArray>
{
    new() { LastName = "Alpha", FirstName = "Beta", Age = "123 yo", MoNumber = true },
    new() { LastName = "Gamma", FirstName = "Delta", Age = "234 \"years\" old", MoNumber = false }
};

Console.WriteLine(ExportCsv(testList));
File.WriteAllText(@"C:\Junk\Junk.csv",ExportCsv(testList));
Console.WriteLine("Finished");
Console.ReadKey();

static string ExportCsv<T>(List<T> list)
{
    if (list == null) return "";
    if (list.Count == 0) return "";
    var sb = new StringBuilder();    
    foreach(var prop in list[0]!.GetType().GetProperties())
    {
        sb.Append($"\"{prop.Name}\",");
    }
    sb.AppendLine();
    foreach(var item in list)
    {
        foreach (var prop in item!.GetType().GetProperties())
        {
            var value = prop.GetValue(item) ?? string.Empty;            
            sb.Append($"\"{value.ToString()!.Replace("\"", "\"\"")} \",");
        }
       sb.AppendLine();
    }
    return sb.ToString();
}

public class TestArray
{
    public string LastName { get; set; } = "";
    public string FirstName { get; set; } = "";
    public string Age { get; set; } = "";
    public bool MoNumber { get; set; }
}
Ответ принят как подходящий
public class TestArray
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Age { get; set; }
    public string MoNumber { get; set; } 
}

public static void ExportCsv<TestArray>(List<TestArray> genericList, string filePath)
{
    var sb = new StringBuilder();
    var header = "";
    var info = typeof(TestArray).GetProperties();
    if (!File.Exists(filePath))
    {
        var file = File.Create(filePath);
        file.Close();
        foreach (var prop in typeof(TestArray).GetProperties())
        {
            header += prop.Name + ",";
        }
        header = header.Substring(0, header.Length - 2);
        sb.AppendLine(header);
        TextWriter sw = new StreamWriter(filePath, true);
        sw.Write(sb.ToString());
        sw.Close();
    }
    foreach (var obj in genericList)
    {
        sb = new StringBuilder();
        var line = "";
        foreach (var prop in info)
        {
            line += prop.GetValue(obj, null) + ",";
        }
        line = line.Substring(0, line.Length - 2);
        sb.AppendLine(line);
        TextWriter sw = new StreamWriter(filePath, true);
        sw.Write(sb.ToString());
        sw.Close();
    }
}

Использование:

    var arrayData = new List<TestArray>
                    {
                        new() {
                            LastName = "John", FirstName = "Deo", Age = "20", MoNumber = "123456789"
                        },
                        new() {
                            LastName = "Seno", FirstName = "Verma", Age = "10", MoNumber = "9876543210"
                        }
                    };

    string filePath = "E:\\FolderName\\fileName.csv";  // file path should be include file Name and extention

    ExportCsv(arrayData, filePath);

Предварительный просмотр загруженного файла

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