在特定位置拆分字符串

时间:2011-05-31 09:22:14

标签: c# .net string

我在这里遇到了一个小问题,我正在寻找一种更好的方法来分割字符串。 例如,我收到一个类似这样的字符串。

0000JHASDF+4429901234ALEXANDER

我知道字符串是用它构建的模式,我有一个像这样的数组。

4,5,4,7,9
0000 - JHASDF - +442 - 9901234 - ALEXANDER

使用String MID命令很容易将整个内容拆分,但是当我收到包含8000 - 10000个数据集的文件时似乎很慢。 那么任何建议我如何能够更快地将数据放入List或字符串数​​组中? 如果有人知道如何使用RegEx做到这一点。

6 个答案:

答案 0 :(得分:10)

var lengths = new[] { 4, 6, 4, 7, 9 };
var parts = new string[lengths.Length];

// if you're not using .NET4 or above then use ReadAllLines rather than ReadLines
foreach (string line in File.ReadLines("YourFile.txt"))
{
    int startPos = 0;
    for (int i = 0; i < lengths.Length; i++)
    {
        parts[i] = line.Substring(startPos, lengths[i]);
        startPos += lengths[i];
    }

    // do something with "parts" before moving on to the next line
}

答案 1 :(得分:6)

不是VB方法中的一个?

string firstPart = string.Substring(0, 4);
string secondPart = string.Substring(4, 5);
string thirdPart = string.Substring(9, 4);
//...

答案 2 :(得分:3)

也许是这样的:

string[] SplitString(string s,int[] parts)
{
  string[] result=new string[parts.Length];
  int start=0;
  for(int i=0;i<parts.Length;i++)
  {
    int len=parts[i];
    result[i]=s.SubString(start, len);
    start += len;
  }
  if(start!=s.Length)
    throw new ArgumentException("String length doesn't match sum of part lengths");
  return result;
}

(我没有编译它,所以它可能包含一些小错误)

答案 3 :(得分:1)

由于Mid()函数是VB,您可以尝试

string.Substring(0, 4);

等等。

答案 4 :(得分:1)

我知道这已经晚了,但在Microsoft.VisualBasic.FileIO命名空间中,您可以找到textfieldparser,它可以更好地处理您的问题。以下是MSDN的链接 - https://msdn.microsoft.com/en-us/library/zezabash.aspx并附有说明。代码在VB中,但您可以轻松地将其转换为C#。您还需要添加对Microsoft.VisualBasic.FileIO命名空间的引用。希望这可以帮助任何人在将来绊倒这个问题。

以下是vb对于提问者问题的看法:

Using Reader As New Microsoft.VisualBasic.FileIO.
   TextFieldParser("C:\TestFolder\test.log")

   Reader.TextFieldType =
      Microsoft.VisualBasic.FileIO.FieldType.FixedWidth
   Reader.SetFieldWidths(4, 6, 4, 7, 9)
   Dim currentRow As String()
   While Not Reader.EndOfData
      Try
         currentRow = Reader.ReadFields()
         Dim currentField As String 
         For Each currentField In currentRow
            MsgBox(currentField)
         Next 
      Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
         MsgBox("Line " & ex.Message &
         "is not valid and will be skipped.")
      End Try 
   End While 
End Using  

答案 5 :(得分:0)

Regex Split Method是可能的,但由于你在字符串中没有特定的分隔符,我怀疑它会有什么用处,而且不太可能更快。

String.Substring也是可能的。您可以使用它:var myFirstString = fullString.Substring(0, 4)