Как я понимаю вопрос:
- Строки в анализируемом файле НЕ являются CSV, они разделены пробелом.
- Значение первого поля каждой строки (марка / модель) может содержать 0 или более фактических пробелов.
- Значения других полей в каждой строке не содержат пробелов, поэтому для них отлично работает разделитель пробелов.
Допустим, у вас есть четыре столбца, и значением первого столбца считается «Nissan Almera 1.4 TDi». Использование обычного метода Split () приведет к получению 7 полей, а не 4.
(непроверенный код)
Сначала просто разбейте его:
int numFields = 4;
string[] myFields = myLine.Split(' ');
Затем исправьте массив:
int extraSpaces = myFields.length-numFields;
if(extraSpaces>0) {
// Piece together element 0 in the array by adding the extra elements
for(int n = 1; n <= extraSpaces; n++) {
myFields[0] += ' ' + myFields[n];
}
// Move the other values back to elements 1, 2, and 3 of the array
for(int n = 1; n < numFields; n++) {
myFields[n] = myFields[n + extraSpaces];
}
}
Наконец, игнорируйте каждый элемент массива, кроме четырех, которые вы на самом деле хотели разобрать.
Другим подходом были бы регулярные выражения. Я думаю, что-то вроде этого будет работать:
MatchCollection m = RegEx.Matches(myLine, "^(.*) ([^ ]+) ([^ ]+) ([^ ]+)$");
string MakeModel = m.Groups[1].Captures[0].ToString();
string ModelYear = m.Groups[2].Captures[0].ToString();
string Price = m.Groups[3].Captures[0].ToString();
string NumWheels = m.Groups[4].Captures[0].ToString();
Здесь нет разбиений или массивов, только захваченные RegEx группы.
Если был встроенный метод String.Reverse () (его нет), я мог бы предложить использовать функцию Replace () VB.NET с параметром Count для замены всех пробелов после первых трех пробелов (при условии четырех полей) в перевернутой необработанной строке, затем перевернуть ее снова и разделить. Что-то вроде:
string[] myFields = Microsoft.VisualBasic.Replace(myLine.Reverse(), " ", "_", 0, 3).Reverse().Split(' ');
myFields[0] = myFields[0].Replace("_", " "); //fix the underscores