C# 在特定位置拆分字符串
我这里有一个小问题,我正在寻找一个更好的方法来分割字符串。 例如,我收到一个如下所示的字符串C# 在特定位置拆分字符串,c#,.net,string,C#,.net,String,我这里有一个小问题,我正在寻找一个更好的方法来分割字符串。 例如,我收到一个如下所示的字符串 0000JHASDF+4429901234ALEXANDER 4,5,4,7,9 0000 - JHASDF - +442 - 9901234 - ALEXANDER 我知道字符串的构造模式,我有一个这样的数字数组 0000JHASDF+4429901234ALEXANDER 4,5,4,7,9 0000 - JHASDF - +442 - 9901234 - ALEXANDER 使用strin
0000JHASDF+4429901234ALEXANDER
4,5,4,7,9
0000 - JHASDF - +442 - 9901234 - ALEXANDER
我知道字符串的构造模式,我有一个这样的数字数组
0000JHASDF+4429901234ALEXANDER
4,5,4,7,9
0000 - JHASDF - +442 - 9901234 - ALEXANDER
使用stringmid命令很容易将整个过程分解,但是当我收到一个包含8000-10000个数据集的文件时,它看起来很慢。
那么,有什么建议可以让我更快地获取列表或字符串数组中的数据吗?
如果有人知道如何使用RegEx执行此操作。可能是这样,但由于字符串中没有特定的分隔符,因此我怀疑它是否有用,也不可能更快
这也是一种可能性。您可以这样使用它:
var myFirstString=fullString.Substring(0,4)
可能是这样的:
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;
}
string[]拆分字符串(字符串s,int[]部分)
{
字符串[]结果=新字符串[parts.Length];
int start=0;
对于(inti=0;i,mid不是一种VB方法吗
string firstPart = string.Substring(0, 4);
string secondPart = string.Substring(4, 5);
string thirdPart = string.Substring(9, 4);
//...
由于Mid()
函数是VB,您可以简单地尝试一下
string.Substring(0, 4);
等等。var length=new[]{4,6,4,7,9};
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
}
var parts=新字符串[Length.Length];
//如果您没有使用.NET4或更高版本,请使用ReadAllLines而不是ReadLines
foreach(File.ReadLines(“YourFile.txt”)中的字符串行)
{
int startPos=0;
for(int i=0;i
我知道这已经很晚了,但在Microsoft.VisualBasic.FileIO命名空间中,您可以找到textfieldparser,它可以更好地处理您的问题。这里是指向MSDN的链接,并附有说明。代码是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
String.Substring
是一种方法,使用正则表达式肯定不会更快…顺便说一句,您的数字是错误的,应该是4,6,4,7,9(JHASDF是6个字符,而不是5个字符)我知道,我仍然对VB.net/C编程有点困惑,一个在工作,一个在家。:PThanks,这几乎和我已经得到的一样,在寻找其他东西,但如果没有更好或更快的方法来做,那我就不得不接受它。@George:如果这会造成任何显著的性能差异,我会感到惊讶,而且这将以降低代码的可读性为代价(不可否认,可读性稍差)。我认为这真的不值得投反对票:如果OP认为这是一个值得进行的微优化,那么他们可以自由地这样做。@LukeH。性能是最初的问题。我们至少在堆上保存了一个方法调用和整个新对象创建。@George:你认为这在这里会引人注目吗?如果你能做到,我会感到惊讶n给我看一个基准测试,其中数组和列表之间的差异不会被文件I/O掩盖。@LukeH:Average:list:11208.41 Average:array:7269.786666667数组快了1.54177976795284,秒表频率:3579545谢谢,我试过了,效果很好。但遗憾的是,到目前为止,它还没有比我看到的更快。如果我将来是否需要它,或者如果我需要重写旧代码:@Lim,我想你已经找到了一个解决方案,所以这是为像我这样偶然发现这个问题的人准备的。我认为textfieldparser虽然速度不快,但更容易理解。当一行与预期结果不匹配时,它也有错误处理。不过谢谢你的反馈。