Измените заголовки файлов CSV / имена столбцов, используя Cinchoo ETL
У меня есть приложение.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 ответ
Пара способов, которыми вы можете переименовать столбцы с новыми именами и произвести вывод CSV
Опция 1:
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}");
}
}
Надеюсь, поможет.