使用Cinchoo ETL修改CSV文件标题/列名称

时间:2018-12-14 13:42:49

标签: c# .net .net-core choetl

我有一个.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 :(得分:2)

使用新名称重命名列并生成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());

选项2:

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}");
    }
}

希望有帮助。