【问题标题】:Delimiting strings based on position c#根据位置 c# 分隔字符串
【发布时间】:2014-12-05 10:27:28
【问题描述】:

例如,我有以下字符串

PT01 0200LB  Wax  N011 00000000500030011 00000000

我需要根据以下条件获取单独的字符串

Position    Description

1-2         Catagory Type
3-6         Action Type
7-15        Kit Number

我需要根据这些位置获取每个单独的字符串。 我该如何处理?

【问题讨论】:

  • 你现在还没有达到你想要的结果,还没有尝试过什么?什么是位置,从零开始的索引?所以类别是T0?
  • 到目前为止你尝试过什么?你在哪里遇到问题?你不知道如何拆分字符串?你不知道如何储存它们吗?您是否想要一种不必将条件表硬编码到代码中的好方法,以便可以将其重用于不同的字符串格式?

标签: c# string split delimiter


【解决方案1】:

我不知道它是否正是您要查找的内容,因为没有根据您的示例发布所需的确切结果,但这应该朝着正确的大方向发展:

public class CustomObject
{
    public string CategoryType { get; set; }
    public string ActionNumber { get; set; }
    public string KitNumber { get; set; }
}
//create Dummy Data
var source = new List<string>()
{
    "PT01 0200LB  Wax  N011 00000000500030011 00000000",
    "PT02 0300LB  Bee  C011 00000000500030011 00000000",
    "PT03 0300LB  Silk  A011 00000000500030011 00000000",
    "PT04 0400LB  Cornflakes  A011 00000000500030011 00000000"
};

var result = from s in source
             select new CustomObject {
                CategoryType = s.Substring(0,2),
                ActionNumber = s.Substring(2,3),
                //read to end
                KitNumber = s.Substring(5, s.Length -6)
             };

输出:

【讨论】:

  • 这是一个很好的答案,尽管我不同意在一个问得不好的问题上花费这么多时间。
  • 第二项是3-6个字符,所以应该是四个字符长。诚然,这确实给了01 0,这看起来很奇怪,但这就是规范,我该判断谁?
  • 是的,我也不太确定。
【解决方案2】:

让我们将位置转换为从零开始的索引 (pos1-1) 和长度 (pos2-pos1+1):

Position    Description     Index  Length

1-2         Catagory Type   0      2
3-6         Action Type     2      4
7-15        Kit Number      6      9

现在您可以在Substring 方法中使用它来获取字符串的一部分。示例:

string actionType = input.Substring(2, 4);

您可能希望从某些子字符串中删除空格。示例:

string actionType = input.Substring(2, 4).Trim();

【讨论】:

    【解决方案3】:

    除了其他出色的答案之外,还有很多方法可以执行此操作。

    通过扩展方法

    /// <summary>Splits the specified string at the specified indexes.</summary>
    /// <param name="str">The string to split.</param>
    /// <param name="delimiters">The delimiters / Indexes to split by.</param>
    /// <returns>A <see cref="T:System.string[]" /> array containing the split result.</returns>
    public static string[] Split(this string str, params int[] delimiters) {
        return delimiters.Select(
            (offset, argIndex) =>
            str.Substring(
                offset,
                (argIndex < delimiters.Length - 1
                        ? delimiters[argIndex + 1] - offset
                        : str.Length - offset)))
                    .ToArray();
    }
    

    用法

    [TestMethod]
    public void SplitByDelimitersTest() {
        // Replace the spaces in this string, it makes it possible to get the data using the extension method.
        var data = "PT01 0200LB  Wax  N011 00000000500030011 00000000".Replace(" ", "");
        var result = data.Split(0, 2, 8);
        var expected = new[] { "PT", "010200", "LBWaxN0110000000050003001100000000" };
        CollectionAssert.AreEqual(expected, result, "Collections were not equal in the SplitByDelimeters test.");
    }
    

    通过 String.Split

    var data = "PT01 0200LB  Wax  N011 00000000500030011 00000000";
    // If you want the extra empty spcaces around "Wax" removed, simply specify StringSplitOptions.RemoveEmptyEntries instead.
    var split = data.Split(new [] {" "}, StringSplitOptions.None);
    
    var categoryType = split[0];
    var actionNumber = split[1];
    var kitNumber = String.Join(" ", split.Skip(2));
    

    通过正则表达式

    var data = "PT01 0200LB  Wax  N011 00000000500030011 00000000";
    
    var match = Regex.Match(data, @"(?<categoryType>..\d\d) (?<actionNumber>\d{4}..)  (?<kitNumber>.+)");
    
    var categoryType = match.Groups["categoryType"].Value;
    var actionNumber = match.Groups["actionNumber"].Value;
    var kitNumber = match.Groups["kitNumber"].Value;
    

    我相信还有更多方法可以做到这一点,可能有一些使用 Serv 回答中的简洁方式。

    【讨论】:

      【解决方案4】:

      您可以使用子字符串或下载一些现成的工具,如

      http://www.filehelpers.net/

      它具有解析固定长度文件的类 单击主页上的“固定长度记录快速入门”

      并按如下方式使用

      [FixedLengthRecord()] 
      public class Record
      { 
          [FieldFixedLength(2)] 
          public int CategoryType; 
      
          [FieldFixedLength(3)] 
          [FieldTrim(TrimMode.Right)] 
          public string ActionType; 
      
          [FieldFixedLength(7)] 
          [FieldTrim(TrimMode.Right)]
          public string KitNumber; 
       }
      

      稍后在您的代码中

      var engine = new FileHelperEngine<Record>();
      Record[] res = engine.ReadFile("FileIn.txt");
      

      【讨论】:

      【解决方案5】:

      我想你想使用 C# Substring?

      string splitStr = Yourstr.Substring(0,2);
      

      Msdn:Substring

      【讨论】:

      • 您能否定义您的字符串的确切描述...例如 PT01 = ? 0200LB = ?蜡 = ? N011 = ? 00000000500030011 00000000 = ?
      • @KiranRamchandraParab Yourstr 是您要拆分的字符串。
      • 我还是没明白...你的例子中的描述是什么
      • @KiranRamchandraParab 这是一个如何使用子字符串的例子。这可能会让人感到困惑。
      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2013-10-19
      • 1970-01-01
      • 2020-01-22
      相关资源
      最近更新 更多