使用 Cinchoo ETL 修改 CSV 文件 headers/column 名称
Modify CSV file headers/column names using 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 header 名称已更改,但我的问题是它删除了我的所有数据并出于某种奇怪的原因添加了文件路径。关于为什么会这样的任何想法?
使用新名称重命名列并生成 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 }));
}
更新:
要获取 headers,请将记录转换为 IDictionary 并在其上使用键 属性 以获取键
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}");
}
}
希望对您有所帮助。
我有一个 .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 header 名称已更改,但我的问题是它删除了我的所有数据并出于某种奇怪的原因添加了文件路径。关于为什么会这样的任何想法?
使用新名称重命名列并生成 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 }));
}
更新:
要获取 headers,请将记录转换为 IDictionary 并在其上使用键 属性 以获取键
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}");
}
}
希望对您有所帮助。