Как проверить, является ли позиция в строке пустой в C # - PullRequest
0 голосов
/ 18 ноября 2009

У меня есть строки с разделенными пробелами значениями, и я хотел бы выбрать один индекс из другого и сохранить его в переменной. Строки следующие:

  John Doe        Villa Grazia           323334I

Мне удалось сохранить удостоверение личности (3-й столбец) с помощью:

if (line.length > 39)
{
   idCard = line.Substring(39, 46);
}

Однако, если я сохраню имя и адрес (1-й и 2-й столбцы) с помощью Подстроки, будут пустые места, поскольку они не имеют одинаковую длину (в отличие от идентификационных карт). Как я могу сохранить эти 2 значения и удалить ненужные пробелы, НО, оставляя пробелы между именем и фамилией?

Ответы [ 8 ]

4 голосов
/ 18 ноября 2009

Попробуйте это:

string line    = "  John Doe        Villa Grazia           323334I";
string name    = line.Substring(02, 16).Trim();
string address = line.Substring(18, 23).Trim();
string id      = line.Substring(41, 07).Trim();
3 голосов
/ 18 ноября 2009
var values = line.Split(' ');
string name = values[0] + " " + values[1];
string idCard = values[4];

Невозможно обойтись без поиска в базе данных по именам, если в предыдущих столбцах нет пробелов.

2 голосов
/ 18 ноября 2009

Они на самом деле разделены пробелами или имеют столбцы фиксированной ширины?

Под этим я подразумеваю, что «столбцы» начинаются с одного и того же индекса в строке в каждом случае - от того, как вы описываете данные, звучит как последний, т. Е. Столбец идентификатора всегда является столбцом 39 для 7 символов.

В этом случае вам необходимо a) вытащить столбцы, используя соответствующие вызовы подстроки, как вы уже делаете, и затем использовать "string" .Trim (), чтобы отрезать пробелы.

Если строки, как кажется, зафиксированы, тогда вы вообще не хотите использовать Split.

1 голос
/ 18 ноября 2009

Возможно "DOH!" вопрос, но вы уверены, что это пробелы, а не табуляция? Похоже, это "мог" быть файл с разделителями табуляции?

Также для точек обзора вы должны использовать String.Empty вместо '' для сравнений, очевидно, он более локализован и удобен для памяти.

1 голос
/ 18 ноября 2009

Похоже, ваша стратегия разбора доставит вам много хлопот. Вы не должны рассчитывать на размер строки для ее анализа.

Почему бы не сохранить данные в формате CSV (Джон Доу, Вилла Грация, 323334I)? таким образом, вы можете предположить, что каждый «столбец» будет разделяться запятой, что облегчит ваши действия по синтаксическому анализу.

1 голос
/ 18 ноября 2009

Как вы можете получить такой идентификатор, если все перед ним имеет переменную длину? Если бы это использовалось для моего имени, «Дэвид Хедлунд 323334I», идентификатор начинался бы с позиции 14, а не с 39.

Попробуйте этот более динамичный подход:

var name = str.Substring(0, str.LastIndexOf(" "));
var id = str.Substring(str.LastIndexOf(" ")+1);
0 голосов
/ 18 ноября 2009

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

const string input = "John Doe        Villa Grazia           323334I";
var name = input.Substring(0, 15).TrimEnd();
var place = input.Substring(16, 38).TrimEnd();
var cardId = input.Substring(39).TrimEnd();

Предполагая, что ваши значения не могут содержать в себе два последовательных пробела, мы можем использовать "" (двойной пробел "в качестве разделителя?
Следующий код разделит вашу строку на основе двойного пробела

const string input = "John Doe        Villa Grazia           323334I";
var entries = input.Split(new[]{"  "}, StringSplitOptions.RemoveEmptyEntries)
                .Select(s=>s.Trim()).ToArray();
string name = entries[0];
string place = entries[1];
string idCard = entries[2];
0 голосов
/ 18 ноября 2009

Первый подход - как уже упоминалось - CSV-подобная структура с определенным токеном в качестве разделителя полей.

Второй будет иметь фиксированную длину поля, так что вы знаете, что первый столбец идет от 1 до 20, второй столбец от 21 до 30 и т. В этом понятии нет ничего плохого, кроме того, что читаемость может быть плохой, если столбцы заполнены до максимума, поэтому между ними не остается пробелов.

Вы можете написать вспомогательную функцию или класс, который знает о длине поля и обеспечивает основанный на индексе отказоустойчивый доступ к конкретному столбцу. Эта функция извлекает отдельные части строки и удаляет начальные и конечные пробелы, но оставляет пробелы между ними как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...