Проблема с.NET String.Split

Я пытаюсь проанализировать текстовый файл, содержащий данные, которые используются на удаленном FTP-сервере. Данные разделяются знаком равенства (=), и я пытаюсь загрузить каждую строку в два столбца в DataGridView. Код, который я написал, отлично работает, за исключением случаев, когда символ равенства перебрасывается во второе значение столбца. Когда это произойдет, независимо от того, укажите ли максимальный счет как 2. Я бы предпочел не менять разделитель, если это возможно.

Вот код, который является проблематичным:

dataGrid_FileContents.Rows.Clear();

 char delimiter = '=';

 StreamReader fileReader = new StreamReader(fileLocation);

 String fileData = fileReader.*********();
 String[] rows = fileData.Split("\n".ToCharArray());

 for(int i = 0; i < rows.Length; i++)
 {
 String str = rows[i];

 String[] items = str.Split(new char[] { delimiter }, 1, StringSplitOptions.******************);

 if (items.Length == 2)
 {
 dataGrid_FileContents.Rows.Add(items[0], items[1]);
 }
 }

 fileReader.Close();

И пример загружаемого файла:

boats=123
cats=234-f
cars==1

Он работает так, как предполагалось, для первых двух строк, а затем игнорирует последнюю строку, так как в итоге он создает String [] с 1 элементом и двумя String [] s с нулевыми элементами.

3 ответа

Просто прочитайте все элементы, помеченные символом '=' в строке. Затем перебирайте элементы и проверяйте, что этот элемент не пуст, чем использовать эти подготовленные данные для записи

здесь проиллюстрирован фрагмент http://dotnetfiddle.net/msVho2

и ваш фрагмент может быть преобразован в нечто подобное ниже

dataGrid_FileContents.Rows.Clear();

char delimiter = '=';

using(StreamReader fileReader = new StreamReader(fileLocation))
{
 string[] data = new string[2];

 while(true)
 {
 string row = fileReader.ReadLine();
 if(row == null)
 break;

 string[] items = row.Split(delimiter);
 int data_index = 0;
 foreach(string item in items)
 {
 if(data_index >= data.Length)
 {
 //TODO: log warning
 break;
 }

 if(!string.IsNullOrWhiteSpace(item))
 {
 data[data_index++] = item;
 }

 }

 if(data_index < data.Length)
 {
 //TODO: log error, only 1 item in row
 continue;
 }


 dataGrid_FileContents.Rows.Add(data[0], data[1]);

 }
}


Попробуйте следующее. Он зафиксирует значение до и после первого "=", правильно разобрав сценарий cars==1.

String[] items = str.Split(new char[] { delimiter }, 2, stringSplitOptions.None);


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

for(int i = 0; i < rows.Length; i++)
{
 String str = rows[i];
 int pos = str.IndexOf(delimiter);
 if (pos != -1)
 {
 string first = str.Substring(0, pos-1);
 string second = str.Substring(pos + 1);
 dataGrid_FileContents.Rows.Add(first, second);
 }
}

licensed under cc by-sa 3.0 with attribution.