【问题标题】:Splitting Lines, Mapping, and Merging to Text File In C#在 C# 中分割线、映射和合并到文本文件
【发布时间】:2015-08-07 15:51:07
【问题描述】:

例如,我有一个 输入文本文件“FILE1.txt”,其内容为

000123400056780001324
000556700034520004758

这里,前 7 个数字 = 项目 1,下一个 = 项目 2,依此类推。

还有另一个输入地图文本文件“MAPFILE.txt”,其内容为

0003452 itema
0001324 itemb
0005567 itemc
0004758 itemd 

假设,第 1 列是项目编号(7 个字符),第 2 列是描述(5 个字符)。

以及我添加的项目中预先存在的文本文件,以便我可以将输出写入它。我们称之为“OUTPUT.txt”-

S.No Item1 Desc1 Item2 Desc2 Item3 Desc3

所以最终,我需要得到

S.No   Item1       Desc1      Item2      Desc2     Item3     Desc3

1      0001234     *          0005678    *         0001324   itemb
2      0005567     itemc      0003452    itema     0004758   itemd

我有大约 100 行这样的行。 如何逐行拆分 FILE1,然后将这些项目编号子字符串映射到 MAPFILE 中的子字符串,最后将它们合并到我已经添加到项目中的 OUTPUT.txt 中? 我是初学者我才刚刚开始。我已经通过这种方式将我的解决方案分解为多个步骤,但我该怎么做呢?

非常感谢!

【问题讨论】:

  • 在你尝试的地方添加代码

标签: c# string file-io merge split


【解决方案1】:

Linq 版本也是可能的

var mapping = File.ReadAllLines("MAPFILE.txt")
              .Select(line => line.Split())
              .Where(parts => parts.Length>1) //Skip empty lines
              .ToDictionary(parts => parts[0], parts => parts[1]);

var lines = File.ReadAllLines("FILE1.txt")
            .Where(line => !String.IsNullOrWhiteSpace(line)) //Skip empty lines
            .Select(line => string.Concat(
                                Regex.Matches(line, ".{7}")
                                .Cast<Match>()
                                .Select(m => m.Value)
                                .Select(s => s.PadLeft(10) + (mapping.ContainsKey(s) ? mapping[s] : "*").PadLeft(10))
                            )
             );


string finalResult = String.Join(Environment.NewLine, lines);

输出:

0001234         *   0005678         *   0001324     itemb
0005567     itemc   0003452     itema   0004758     itemd

【讨论】:

  • 非常感谢 Eser,我理解了代码并将其用作我的程序的基础。另外,如何在我的输出文件中创建一个自动生成行号的列?如果输入文件读取 01000123400005678,我如何将开头的“01”拆分为行号,然后将字符串的其余部分拆分为 7 的子字符串?我可以看到必须编辑 string.Concat(Regex.Matches) 行,但它似乎不包含数组条目...请帮帮我?
  • @neha 要自动生成行号,您可以使用 string finalResult = String.Join(Environment.NewLine, lines.Select((line,num)=&gt; string.Format("{0,-6} {1}",num+1,line))); 对于正则表达式部分,请尝试此代码 var parts = Regex.Matches("01000123400005678", @"(^\d\d|[^\^]{7})").Cast&lt;Match&gt;().Select(m =&gt; m.Value).ToList();
  • 谢谢@Eser :) 我用过 .Select((line, i) => (++i) + " " + String.Concat(System.Text.RegularExpressions.Regex.Matches(line , ".{7}") 并且也完成了这项工作。无论如何,对于那个正则表达式部分,它不仅仅是一个这样的条目......几乎有一百个像 "0100012340005678" "020001233000333" "0300023420002222" "04..." "05..." 等等(行号在那个字符串中混杂了),我如何从读取字符串的正则表达式语句中删除它?
猜你喜欢
  • 2013-11-09
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多