Расщепление строк в определенных позициях - PullRequest
5 голосов
/ 31 мая 2011

У меня здесь небольшая проблема, я ищу лучший способ разделить строки. Например, я получаю строку, похожую на эту.

0000JHASDF+4429901234ALEXANDER

Я знаю шаблон, из которого построена строка, и у меня есть массив чисел, подобных этому.

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

Легко разделить все это с помощью команды String MID, но это кажется медленным, когда я получаю файл, содержащий 8000 - 10000 наборов данных. Итак, какие-либо предложения, как я могу сделать это быстрее, чтобы получить данные в список или массив строк? Если кто-нибудь знает, как это сделать, например, с помощью RegEx.

Ответы [ 6 ]

10 голосов
/ 31 мая 2011
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
}
6 голосов
/ 31 мая 2011

Разве не середина метода VB?

string firstPart = string.Substring(0, 4);
string secondPart = string.Substring(4, 5);
string thirdPart = string.Substring(9, 4);
//...
3 голосов
/ 31 мая 2011

Возможно что-то вроде этого:

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

(я не скомпилировал его, поэтому, возможно, он содержит незначительные ошибки)

1 голос
/ 10 августа 2015

Я знаю, что уже поздно, но в пространстве имен 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  
1 голос
/ 31 мая 2011

Поскольку функция Mid() является VB, вы можете просто попробовать

string.Substring(0, 4);

и т. Д.

0 голосов
/ 31 мая 2011

Метод Regex Split был бы возможен, но, поскольку у вас нет определенного разделителя в строке, я сомневаюсь, что он будет полезен и вряд ли будет быстрее.

String.Substring также возможна. Вы используете это как: var myFirstString = fullString.Substring(0, 4)

...