C# 如何解析具有多个分隔符的文本文件

C# 如何解析具有多个分隔符的文本文件,c#,parsing,delimiter,C#,Parsing,Delimiter,我正试图解析一个文本文件。数据是单个字符串,使用四种类型的除沫器。文件末尾还有一个与我可以忽略的数据无关的记录计数 除沫器: 数据的开头:~ 字段分隔符:| 记录结束:# 数据结束:^ 示例文本文件: ~001|John|Smith|300#002|Abby|Williams|250#003|Tom|Jones|400#004|Claire|Benton|300^ Count:4 解析后的数据应存储在对象“Account”的列表或集合中 我还是编程新手,所以请教我解析和存储这些数据的最佳方法是

我正试图解析一个文本文件。数据是单个字符串,使用四种类型的除沫器。文件末尾还有一个与我可以忽略的数据无关的记录计数

除沫器:

数据的开头:~
字段分隔符:|
记录结束:#
数据结束:^

示例文本文件:

~001|John|Smith|300#002|Abby|Williams|250#003|Tom|Jones|400#004|Claire|Benton|300^
Count:4
解析后的数据应存储在对象“Account”的列表或集合中

我还是编程新手,所以请教我解析和存储这些数据的最佳方法是什么?
提前感谢。

如果您知道所有分隔符,您可以使用以下内容:

var s = "~001|John|Smith|300#002|Abby|Williams|250#003|Tom|Jones|400#004|Claire|Benton|300^Count: 4";

// select a line between "~" and "^".
var data = new string(s.SkipWhile(c => c == '~').TakeWhile(c => c != '^').ToArray());
var records = data.Split('#');
var accounts = records.Select(record => record.Split('|'))
  .Select(items => new Account
  {
    IdNum = items[0],
    FirstName = items[1],
    LastName = items[2],
    AmtDue = items[3]
  })
  .ToList();

foreach (var account in accounts)
{
  Console.WriteLine(account.IdNum);
  Console.WriteLine(account.FirstName);
  Console.WriteLine(account.LastName);
  Console.WriteLine(account.AmtDue);
  Console.WriteLine();
}
首先按行分隔符拆分,然后按字段分隔符拆分


注意:不要忘记检查
null
上的变量或您需要的数组长度。

他们应该将源数据放入xml并称之为良好。我知道这是一项学校作业,但我对现实生活中有多少种方式会失败感到畏缩。哈哈,我希望这是一项课堂作业。我理解你的意思,我完全同意你的看法。如果有选择的话,我会立即将格式更改为XML。不幸的是,这是一个旧设计的系统,被甩在我身上,我无法控制它会吐出什么。数据格式是我必须处理的一个限制。我只需要尽我所能,这是我第一次在滑雪和业余时间遇到。这是一个比我写的regex rube goldberg更简单、更好的解决方案。谢谢你的帮助!
var s = "~001|John|Smith|300#002|Abby|Williams|250#003|Tom|Jones|400#004|Claire|Benton|300^Count: 4";

// select a line between "~" and "^".
var data = new string(s.SkipWhile(c => c == '~').TakeWhile(c => c != '^').ToArray());
var records = data.Split('#');
var accounts = records.Select(record => record.Split('|'))
  .Select(items => new Account
  {
    IdNum = items[0],
    FirstName = items[1],
    LastName = items[2],
    AmtDue = items[3]
  })
  .ToList();

foreach (var account in accounts)
{
  Console.WriteLine(account.IdNum);
  Console.WriteLine(account.FirstName);
  Console.WriteLine(account.LastName);
  Console.WriteLine(account.AmtDue);
  Console.WriteLine();
}