Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在特定位置拆分字符串_C#_.net_String - Fatal编程技术网

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虽然速度不快,但更容易理解。当一行与预期结果不匹配时,它也有错误处理。不过谢谢你的反馈。