【问题标题】:Split a string into substrings at variable widths in C#在 C# 中将字符串拆分为可变宽度的子字符串
【发布时间】:2015-10-19 19:21:35
【问题描述】:

我有一个固定长度的字符串,必须沿字符串在可变位置拆分以产生子字符串。

30849162 AUF3063100-2022031Doe Deanne 2610194031482100720081007200820000000000G43Z4206372 10 8 98282000000000911140000 00000000K6358Z8643K638 D126 Z099 320930090308009251519 132093 100720080071 0000000000000000000000000000000000000000000000000000000000000 000000000002022031 000000000000000000000000000000000000000000000 00000000

列断点是: 15、18、33、61、81、89、93、94、102、110、111、114、118、

有人知道我该怎么做吗?我实际上有数千行要解析

【问题讨论】:

  • 忘记了:原始字符串的长度总是 1257 个字符
  • 变量是什么意思?休息时间可以在您列出的任何点上,还是在每个点上?
  • 你不能只取子字符串吗? 0-15、16-18、19-33 等?
  • 在这里查看我的答案stackoverflow.com/questions/29653991/…。这应该对您有所帮助。
  • 因为你知道每个字段的长度,所以这里有一个小提琴演示(dotnetfiddle.net/mZNIEW),代码来自我之前的评论。

标签: c# string parsing split substring


【解决方案1】:

将断点放在一个数组中,并在这些数字的循环中使用.substring()。这大致是您想要的方式,但您必须对其进行调整以准确补偿您想要分栏符的位置。

int[] nums = {0, 15, 18, 33, 61, 81, 89, 93, 94, 102, 110, 111, 114, 118 };
string input = "Long string here";

for (int i = 0; i < nums.Length - 1; i++)
{
    Console.WriteLine(input.Substring(nums[i], nums[i + 1] - nums[i]));
}

【讨论】:

    【解决方案2】:

    或者你可以像这样使用一些讨厌的 LINQ..

    public string[] ReturnMyStrings(string str)
    {
        int[] br = { 15, 18, 33, 61, 81, 89, 93, 94, 102, 110, 111, 114, 118 }; 
        return br.Select((x, i) => 
           str.Substring(br.ElementAtOrDefault(i - 1), x - br.ElementAtOrDefault(i - 1)))
           .ToArray();
    }
    

    【讨论】:

      【解决方案3】:

      如果您想让您的代码可扩展,您可以实现一些类来完成这项工作。

      static void Main(string[] args)
      {
          string inputString = "30849162 AUF3063100-2022031Doe Deanne " +
                              "2610194031482100720081007200820000000000G43Z4" +
                              "206372 10 8 98282000000000911140000 00000000K" +
                              "6358Z8643K638 D126 Z099 320930090308009251519" +
                              "132093 100720080071 0000000000000000000000000" +
                              "000000000000000000000000000000000000000000000" +
                              "002022031 00000000000000000000000000000000000" +
                              "0000000000 00000000";
      
          //myRecord will hold the entire input in its split form
          var myRecord = new StringSplitterRecord()
          {
               fields = new List<StringSplitterField>()
               {
                   //define all the different fields
                   new StringSplitterField(inputString, 0, 15, "Name of field 1"),
                   new StringSplitterField(inputString, 15, 3, "Name of field 2"),
                   new StringSplitterField(inputString, 18, 15, "Name of field 3"),
                   new StringSplitterField(inputString, 33, 28, "Name of field 4"),
                   new StringSplitterField(inputString, 61, 20, "Name of field 5"),
                   new StringSplitterField(inputString, 81, 8, "Name of field 6"),
                   new StringSplitterField(inputString, 93, 1, "Name of field 7"),
                   new StringSplitterField(inputString, 94, 8, "Name of field 8"),
                   new StringSplitterField(inputString, 102, 8, "Name of field 9"),
                   new StringSplitterField(inputString, 110, 1, "Name of field 10"),
                   new StringSplitterField(inputString, 111, 3, "Name of field 11"),
                   new StringSplitterField(inputString, 114, 4, "Name of field 12"),
              }
          };
      }
      
      class StringSplitterRecord
      {
          public List<StringSplitterField> fields;
      }
      
      class StringSplitterField
      {
          private string _contents;
          private string _fieldType;
      
          public StringSplitterField(string originalString, int startLocation, int length, string fieldType)
          {
              _contents = originalString.Substring(startLocation, length);
              _fieldType = fieldType;
          }
      }
      

      这不仅会将您的输入字符串拆分为需要的部分,而且会将它们全部放在一个列表中,每个子部分都有一个名称。然后您可以使用 LINQ 等来检索您需要的数据。

      【讨论】:

      • 谢谢马特。我想我可以结合你的方法和 Shar1er80 来扩展它
      • 代码可扩展性的最佳选择是自定义FixedLengthAttribute。例如,一个模型可以有多个字符串属性,并且每个属性都有固定的长度。您可以通过指定字段分隔符轻松将此模型映射到任何字符串。
      • @AndreyMolotkov 如果要将其设为属性,则必须将长度硬编码到类/属性中。通过在构造函数中将长度作为参数,它可以动态设置长度。这使代码更具可重用性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 2015-01-16
      • 2011-11-25
      相关资源
      最近更新 更多