Как экспортировать список объектов в файл, разграниченный точкой с запятой?

Оказывается, что у меня есть необходимость производить файл, разграниченный точками с запятой со списка объектов.

Серьезная мой класс:

 public class RipsUS
{
    public string TipoIdUsuario { get; set; }
    public string NumIdUsuario { get; set; }
    public string CodEntAdm { get; set; }
    public int TipoUsuario { get; set; }
    public string PrimApeUsuario { get; set; }
    public string SegApeUsuario { get; set; }
    public string PrimNomUsuario { get; set; }
    public string SegNomUsuario { get; set; }
    public int Edad { get; set; }
    public int UnidadMedidaEdad { get; set; }
    public string Sexo { get; set; }
    public string CodDepartamento { get; set; }
    public string CodMunicipio { get; set; }
    public string Zona { get; set; }

}

Я верю в список объектов этого класса

List<RipsUS> listaRipsUs = new List<RipsUS>();

Уже у меня есть список с нагруженными данными, но сейчас я не знаю, как делать, чтобы производить файл, разграниченный точкой с запятой.

4
задан 21.11.2016, 21:30
3 ответа

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

Пример одной освободил бы простая, который ты можешь тестировать, именно, CsvHelper ты можешь загружать из-за NuGet. Кажется, что несколько человек это используют. Это хорошее, так как он показывает, что оно функционирует хорошо, и вероятно уже были исправлены потенциальные недостатки.

Используя твой класс RipsUS, здесь у тебя есть пример того, как ты можешь писать в файл и потом читать это правильно, даже если ты использовал символы как ; или ,.

Код:

public static void Main()
{
    var list = new List<RipsUS>();
    list.Add(new RipsUS { TipoIdUsuario = "zona", Edad = 56 });
    list.Add(new RipsUS { TipoIdUsuario = "ID", Edad = 100 });
    list.Add(new RipsUS { TipoIdUsuario = "ID,a;t\"hola;", Edad = 100 });

    // Test de escritura al archivo.
    using (var fileWriter = new StreamWriter(File.OpenWrite(@"d:\test\test.csv"), Encoding.UTF8))
    using (var csvWriter = new CsvWriter(fileWriter))
    {
        csvWriter.WriteRecords(list);
    }

    // Test de lectura del archivo.
    using (var fileReader = new StreamReader(File.OpenRead(@"d:\test\test.csv"), Encoding.UTF8))
    using (var csvReader = new CsvReader(fileReader))
    {
        foreach (var record in csvReader.GetRecords<RipsUS>())
        {
            Console.WriteLine(record.TipoIdUsuario);
        }
    }
}

Оказанный консолью:

zona
ID
ID,a;t"hola;

Контент файла:

TipoIdUsuario,NumIdUsuario,CodEntAdm,TipoUsuario,PrimApeUsuario,SegApeUsuario,PrimNomUsuario,SegNomUsuario,Edad,UnidadMedidaEdad,Sexo,CodDepartamento,CodMunicipio,Zona
zona,,,0,,,,,56,0,,,,
ID,,,0,,,,,100,0,,,,
"ID,a;t""hola;",,,0,,,,,100,0,,,,
2
ответ дан 24.11.2019, 12:29

Как альтернатива в ответ @lois6b, ты можешь использовать Reflection , чтобы производить файл CSV, что-либо подобное:

public void ACsv(string pathFichero)
{
    StringBuilder lineas = new StringBuilder();

    FieldInfo[] fields = typeof(RipsUS).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

    bool newline = true;

    foreach (object o in listaRipsUs)
    {
        foreach (var f in fields)
        {
            if (newline)
                newline = !newline;
            else
                lineas.Append(";");

            var x = f.GetValue(o);

            if (x != null)
                lineas.Append(x.ToString());
        }
        lineas.Append(Environment.NewLine);
        newline = true;
    }

    File.WriteAllText(pathFichero, lineas.ToString());
}

Использование serГ - в просто:

ACsv(@"c:\temp\archivo.csv");

Это могло бы превращаться в один mГ©todo extensiГіn характерно, таким образом что было бы возможно использовать для любого класса.

2
ответ дан 24.11.2019, 12:29

Ты можешь делать один StringBuilder и помещать там ее informaciГіn отделенная запятыми, despuГ©s, сохранять это как файл:

var csv = new StringBuilder();

//loop

    var newLine = string.Format("{0},{1},.....", tipoIdUsuario, numIdUsuario,.... );
    csv.AppendLine(newLine);  

//fin loop

    File.WriteAllText(filePath, csv.ToString());
1
ответ дан 24.11.2019, 12:29