Измените заголовки файлов CSV / имена столбцов, используя Cinchoo ETL - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть приложение .Net Core, в котором я хочу изменить имена столбцов CSV-файла.Я использую библиотеку Cinchoo ETL.Я пробовал следующее:

string csv = "../../../../data.csv";
using (var w = new ChoCSVWriter(csv).WithFirstLineHeader().Setup(s => s.FileHeaderWrite += (o, e) =>
{
    e.HeaderText = "Test,Test2";
}))
{
    w.Write(csv);
}

Вот так выглядит мой файл data.csv:

ID,Name
1, David
2, Bob

Вот так выглядит мой CSV после запуска моего кода:

Test,Test2
../../../../data.csv

Имена заголовков csv изменились, но моя проблема в том, что он удалил все мои данные и добавил путь к файлу по какой-то странной причине.Есть идеи, почему это так?

1 Ответ

0 голосов
/ 14 декабря 2018

Пара способов переименовать столбцы с новыми именами и создать CSV-вывод

Option1:

StringBuilder csvIn = new StringBuilder(@"ID,Name
1, David
2, Bob");

StringBuilder csvOut = new StringBuilder();

using (var r = new ChoCSVReader(csvIn)
    .WithFirstLineHeader()
    )
{
    using (var w = new ChoCSVWriter(csvOut)
        .WithFirstLineHeader()
        )
        w.Write(r.Select(r1 => new { Test1 = r1.ID, Test2 = r1.Name }));
}

Console.WriteLine(csvOut.ToString());

Option2:

StringBuilder csvIn = new StringBuilder(@"ID,Name
1, David
2, Bob");

StringBuilder csvOut = new StringBuilder();

using (var r = new ChoCSVReader(csvIn)
    .WithFirstLineHeader()
    )
{
    using (var w = new ChoCSVWriter(csvOut)
        .WithFirstLineHeader()
        .Setup(s => s.FileHeaderWrite += (o, e) =>
        {
            e.HeaderText = "Test,Test2";
        })
        )
        w.Write(r);
}

Console.WriteLine(csvOut.ToString());

ОБНОВЛЕНИЕ:

Использование файлов CSV вместо ввода текста

string csvInFilePath = @"C:\CSVIn.csv"
string csvOutFilePath = @"C:\CSVOut.csv"

using (var r = new ChoCSVReader(csvInFilePath)
    .WithFirstLineHeader()
    )
{
    using (var w = new ChoCSVWriter(csvOutFilePath)
        .WithFirstLineHeader()
        )
        w.Write(r.Select(r1 => new { Test1 = r1.ID, Test2 = r1.Name }));
}

ОБНОВЛЕНИЕ:

Чтобы получить заголовки, приведите запись к IDictionary и используйте для этого свойство Keys, чтобы получить ключи

string csvInFilePath = @"C:\CSVIn.csv"
string csvOutFilePath = @"C:\CSVOut.csv"

using (var r = new ChoCSVReader(csvInFilePath)
    .WithFirstLineHeader()
    )
{
    foreach (IDictionary<string, object> rec in r)
    {
         var keys = rec.Keys.ToArray();
    }
}

Чтобы автоматически обнаруживать типы данных столбцов CSV, необходимо установить MaxScanRows для анализатора.В противном случае все столбцы будут обрабатываться как строковый тип.

StringBuilder csvIn = new StringBuilder(@"ID,Name,Date
1, David, 1/1/2018
2, Bob, 2/12/2019");

using (var r = new ChoCSVReader(csvIn)
    .WithFirstLineHeader()
    .WithMaxScanRows(2)
    )
{
    foreach (IDictionary<string, object> rec in r.Take(1))
    {
        foreach (var kvp in rec)
            Console.WriteLine($"{kvp.Key} - {r.Configuration[kvp.Key].FieldType}");
    }
}

Надеюсь, это поможет.

...