2011-05-31 213 views
3

我在这里遇到了一些问题,我正在寻找更好的方法来分割字符串。 例如,我收到一个像这样的字符串。在特定位置分割字符串

0000JHASDF+44299ALEXANDER 

我知道字符串构建模式,我有这样的数组数组。

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

这是很容易使用String MID命令分割了整个事情了,但它似乎当我收到包含8000点文件是缓慢的 - 10000的数据集。 因此,任何建议我如何能更快地获取列表或字符串数​​组中的数据? 如果有人知道如何使用RegEx执行此操作。

+1

'String.Substring'是要走的路,它肯定不会使用正则表达式会更快... – 2011-05-31 09:26:07

+2

BTW ,你的数字是错误的,它应该是4,6,4,7,9(JHASDF是6个字符,而不是5) – 2011-05-31 09:35:31

回答

0

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

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

2

也许是这样的:

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; 
} 

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

5

是不是中旬VB方法?

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

由于Mid()功能是VB,你可以简单地尝试

string.Substring(0, 4); 

等。

+1

我知道,仍然有点困惑VB.net/C#编程有一个在工作,一个在家。 :P – Lim 2011-05-31 09:43:36

8
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 
} 
+0

谢谢,这几乎是我已经得到的同样的东西,寻找别的东西,但如果没有更好或更快的方式来做到这一点,比我只需要忍受它。 – Lim 2011-05-31 09:49:20

+0

@ user777382:通过小小的调整和微观优化,你可能会稍微快一点,但我认为你会发现比这种一般方法快得多。 – LukeH 2011-05-31 09:51:12

+0

-1对List的不必要的使用,因为事先知道数组的长度 – 2011-05-31 09:53:44

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 
+0

谢谢,我试过了,它工作正常。但令人遗憾的是,迄今为止,它的速度并不快。如果我将来需要它,或者如果我需要重写旧代码,仍然会使用它。 :) – Lim 2015-08-12 09:25:38

+0

@Lim,好吧,我想你已经得到了一个解决方案,所以这是像我这样的人偶然发现这个问题。我认为textfieldparser虽然不会更快,但会更容易理解。当一行不符合预期结果时,它也有错误处理。感谢您的反馈。 – Wade73 2015-08-12 10:03:34