C# 使用不同的id号更新重复项
我有一个.csv文件<代码>第1列、第2列、第3列定义键组合 每当组合键重复时,重复的行应如下所示:C# 使用不同的id号更新重复项,c#,string,C#,String,我有一个.csv文件第1列、第2列、第3列定义键组合 每当组合键重复时,重复的行应如下所示: 3 A 120/1 Line 如果它再次重复,/1应该增加到/2,/3,以此类推。我应该如何使用c#?实现这一点?如果您有一个简单的CSV(无报价),您可以尝试GroupBy: // Csv separator; it seems that you use `\t` char sep = '\t'; var result = File .ReadLines
3 A 120/1 Line
如果它再次重复,/1
应该增加到/2
,/3
,以此类推。我应该如何使用c#?实现这一点?如果您有一个简单的CSV(无报价),您可以尝试GroupBy
:
// Csv separator; it seems that you use `\t`
char sep = '\t';
var result = File
.ReadLines(@"c:\MyFile.csv")
//.Skip(1) // if you want to get rid of columns' captions
.Select(line => line.Split(new char[] {sep},
StringSplitOptions.RemoveEmptyEntries))
.GroupBy(items => new {
key1 = items[1],
key2 = items[2],
key3 = items[3], })
.SelectMany(chunk => chunk
.Select((items, index) => index == 0
? string.Join(sep.ToString(), items)
: string.Join(sep.ToString(),
items[0],
items[1],
$"{items[2]}/{index}",
string.Join(sep.ToString(), items.Skip(3)))));
演示:让我们以字符串文本的形式进行测试:
string text =
@"1 A 120 Hdr
2 A 120 Line
3 A 120 Line
4 B 130 Hdr ";
而不是File.ReadLines
我们将text
拆分为几行:
char sep = ' ';
var result = text
.Split(new char[] { '\r', '\n'}, StringSplitOptions.RemoveEmptyEntries)
.Select(line => line.Split(new char[] {sep},
StringSplitOptions.RemoveEmptyEntries))
.GroupBy(items => new {
key1 = items[1],
key2 = items[2],
key3 = items[3], })
.SelectMany(chunk => chunk
.Select((items, index) => index == 0
? string.Join(sep.ToString(), items)
: string.Join(sep.ToString(),
items[0],
items[1],
$"{items[2]}/{index}",
string.Join(sep.ToString(), items.Skip(3)))));
Console.Write(string.Join(Environment.NewLine, result));
结果:
1 A 120 Hdr
2 A 120 Line
3 A 120/1 Line
4 B 130 Hdr
如果您有一个简单的CSV(无报价),您可以尝试GroupBy
:
// Csv separator; it seems that you use `\t`
char sep = '\t';
var result = File
.ReadLines(@"c:\MyFile.csv")
//.Skip(1) // if you want to get rid of columns' captions
.Select(line => line.Split(new char[] {sep},
StringSplitOptions.RemoveEmptyEntries))
.GroupBy(items => new {
key1 = items[1],
key2 = items[2],
key3 = items[3], })
.SelectMany(chunk => chunk
.Select((items, index) => index == 0
? string.Join(sep.ToString(), items)
: string.Join(sep.ToString(),
items[0],
items[1],
$"{items[2]}/{index}",
string.Join(sep.ToString(), items.Skip(3)))));
演示:让我们以字符串文本的形式进行测试:
string text =
@"1 A 120 Hdr
2 A 120 Line
3 A 120 Line
4 B 130 Hdr ";
而不是File.ReadLines
我们将text
拆分为几行:
char sep = ' ';
var result = text
.Split(new char[] { '\r', '\n'}, StringSplitOptions.RemoveEmptyEntries)
.Select(line => line.Split(new char[] {sep},
StringSplitOptions.RemoveEmptyEntries))
.GroupBy(items => new {
key1 = items[1],
key2 = items[2],
key3 = items[3], })
.SelectMany(chunk => chunk
.Select((items, index) => index == 0
? string.Join(sep.ToString(), items)
: string.Join(sep.ToString(),
items[0],
items[1],
$"{items[2]}/{index}",
string.Join(sep.ToString(), items.Skip(3)))));
Console.Write(string.Join(Environment.NewLine, result));
结果:
1 A 120 Hdr
2 A 120 Line
3 A 120/1 Line
4 B 130 Hdr
这种形式的问题太广泛了。请展示您用于读取文件、提取数据以及如何表示/存储数据的代码,最好是第一次尝试自己解决此问题。从这一点开始,我们可以继续。在这种形式下,问题太广泛了。请展示您用于读取文件、提取数据以及如何表示/存储数据的代码,最好是第一次尝试自己解决此问题。从这一点开始,我们可以继续。我唯一的意见是,您正在分析tsv文件:)也许“\t”应该是一个参数:)除此之外,正是我的思路,更快fingers@Alexandru克龙尼亚:同意,谢谢!我已经编辑了答案我唯一的评论是您正在解析tsv文件:)也许“\t”应该是一个参数:)除此之外,正是我的思路,更快fingers@Alexandru克龙尼亚:同意,谢谢!我已经编辑了答案