我在这里遇到了一个小问题,我正在寻找一种更好的方法来分割字符串。 例如,我收到一个类似这样的字符串。
0000JHASDF+4429901234ALEXANDER
我知道字符串是用它构建的模式,我有一个像这样的数组。
4,5,4,7,9
0000 - JHASDF - +442 - 9901234 - ALEXANDER
使用String MID命令很容易将整个内容拆分,但是当我收到包含8000 - 10000个数据集的文件时似乎很慢。 那么任何建议我如何能够更快地将数据放入List或字符串数组中? 如果有人知道如何使用RegEx做到这一点。
答案 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)