найти индекс первого числа, которое появляется после определенной подстроки в С#

Справочная информация

У меня есть fez panda II (работает на netmf 4.1). ), в котором читается загрузка байтов. Затем эти байты сохраняются на SD-карту в текстовом формате.

В настоящее время я сохраняю файл как 1, 2, 3...

Однако вместо этого мне нужно, чтобы они были с отметкой времени.

Поскольку Panda регулярно теряет питание, я не могу использовать встроенные часы и свойство DateTime.Now.

Считываемые байты также содержат время начала.

Формат строки выглядит примерно так:

c5@!c5dcSTART 11/01/2015          12:49:12
more data.... 124 xyz
more data...
some more data...
some even more numeric/text data...
more data which include the word "START"...

Цель

Есть ли способ получить это время начала? Он также должен быть довольно быстрым, так как данные считываются с некоторой скоростью, а поток обработки файлов уже немного отстает.

Дату также необходимо сохранить как имя файла, поэтому косую черту, возможно, потребуется заменить альтернативами «безопасное имя файла».

Моя общая цель - ставить временные метки на файлы по мере их сохранения.

Я думаю, что если бы я мог получить первые 12 цифр после первого вхождения START, я должен работать дальше оттуда.

Кто-нибудь знает, как я могу получить индекс «1» после слова «СТАРТ»?


Попытки датировать

Я попытался использовать String.IndexOf, затем подстроку, содержащую «строку», за которой следует обрезка, хотя это кажется чрезвычайно медленным и, скорее всего, приведет к потере данных.

Я также попытался разбить все сообщение на массив символов (и пройти, чтобы найти слово «СТАРТ», а затем пройти, чтобы получить «числа» после него), но это также кажется очень неэффективным


Обновления

Совсем недавно я узнал, что не могу использовать регулярное выражение, поскольку оно было реализовано только для NetMF 4.2+, тогда как Fez Panda работает на 4.1.


person jbutler483    schedule 12.01.2015    source источник
comment
так START подстрока? И будет ли это происходить и с остальными данными? Есть ли что-нибудь еще, что было бы более описательным?   -  person Mike Dinescu    schedule 12.01.2015
comment
К сожалению, Start появляется несколько раз. Я просто знаю, что цифры появляются после первого вхождения.   -  person jbutler483    schedule 12.01.2015
comment
@CoderDennis: используя подобные IndexOf () .., разбивая его на массив символов и работая оттуда. Я просто не умею писать эффективный код.   -  person jbutler483    schedule 12.01.2015
comment
Если первый START появляется в согласованной позиции, использование Substring с начальным индексом и длиной будет самым быстрым.   -  person user1620220    schedule 12.01.2015
comment
@ user1620220: оно не появляется в постоянной позиции, я боюсь, хотя всегда должно быть первым словом перед этой датой и временем   -  person jbutler483    schedule 12.01.2015
comment
Если вы замечаете большой удар по производительности при простом чтении строки, я подозреваю, что строка очень большая, и вместо этого может иметь смысл передать ее в потоковом режиме. то есть только для чтения, пока вы не найдете то, что ищете.   -  person user1620220    schedule 12.01.2015
comment
@ user1620220: это было бы отличной идеей для большинства пользователей. Только в этом случае его все равно придется читать и сохранять. (сообщение было прочитано в этот момент, просто не сохранено). Я просто пытался извлечь дату, чтобы сохранить ее в качестве имени файла (обратите внимание, косая черта также может вызвать проблемы с именем файла)   -  person jbutler483    schedule 12.01.2015
comment
В этом случае похоже, что вы не добьетесь большего успеха, чем то, что вы называете своей второй попыткой. Если это недостаточно быстро, вам придется все переосмыслить.   -  person user1620220    schedule 12.01.2015
comment
идет переосмысление...   -  person jbutler483    schedule 12.01.2015


Ответы (4)


выполнение на первом ряду данных следующего кода должно давать желаемые значения

 var splits = val.Split(new char[]{' ', '\t'}`)
 string date = splits[1];
 string time = splits[2];
person Tigran    schedule 12.01.2015

Вы можете использовать регулярное выражение:

Regex r = new Regex("START\\s([\\d/]+)\\s+([\\d:])", RegexOptions.IgnoreCase);
Match m = r.Match(text);
if (m.Success) 
{
    string date = m.Groups[1].Value;  // this is the date portion
    string time = m.Groups[2].Value;  // this is the time portion
}

Вы также можете изменить шаблон, чтобы он был более строгим:

(\\d\\d?/\\d\\d?/\\d\\d)\\s+(\\d\\d?:\\d\\d?:\\d\\d?)
person Mike Dinescu    schedule 12.01.2015
comment
к сожалению (будучи девственником регулярных выражений), я только что узнал, что Panda II работает с netMF 4.1 и поэтому не имеет регулярных выражений. Regex впервые был реализован для NetMF в версии 4.2 :( - person jbutler483; 12.01.2015

используйте string.split("text"), затем получите второй элемент массива (это часть после строки, которую вы ищете, и используйте регулярное выражение следующим образом:

System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
person Alexander angelov    schedule 12.01.2015
comment
к сожалению (будучи девственником регулярных выражений), я только что узнал, что Panda II работает с netMF 4.1 и поэтому не имеет регулярных выражений. Regex впервые был реализован для NetMF в версии 4.2 :( - person jbutler483; 12.01.2015
comment
Сделайте это плохим способом, используйте IndexOf для всех чисел 0-9, а затем найдите наименьшее число, которое вы можете сделать, используя цикл for и массив. Отметьте как отвеченный, если считаете вопрос отвеченным - person Alexander angelov; 12.01.2015

В итоге я использовал адаптацию ответа @Tigran о разделении и выглядел так:

var x = message.IndexOf("START")+5;
string time = message.Substring(x,35);
string [] test = time.Split(new char[]{'/',':'});

В котором я мог бы затем получить к нему доступ через

test[0]+test[1]+test[2]+test[3]+test[4];

Еще раз, я признаю, что это, безусловно, далеко, вероятно, самый неэффективный способ решения этой проблемы, пока, по крайней мере, он кажется способным справиться нормально. (Хотя я все равно приму ответ Тиграна).

person jbutler483    schedule 12.01.2015