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





Попробуй это:
Вы уже определили класс 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.
}
Ниже приведен метод записи списка объектов 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
}
}
Теперь вы можете использовать этот метод для создания файла 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.Вы можете использовать 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);
Предварительный просмотр загруженного файла
CsvHelper — это пакет с открытым исходным кодом. Посмотрите, как они это сделали. Очевидно, это не практический вопрос (в реальном сценарии вы бы использовали пакет). А если для вашего образования - то в чем именно вопрос?