Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不同的id号更新重复项_C#_String - Fatal编程技术网

C# 使用不同的id号更新重复项

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

我有一个.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(@"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克龙尼亚:同意,谢谢!我已经编辑了答案