sopi9 Ответов: 4

Как извлечь данные из строки в C#


Я получаю данные в своем приложении через RFC. RFC возвращает данные в нескольких параметрах / переменных. Один из параметров возвращается ниже строки.
STRUCTURE ERRMSG{FIELD TYPE=E 
		FIELD ID = 
		FIELD NUMBER=000 
		FIELD MESSAGE=Invalid Referral Link 
		FIELD LOG_NO= FIELD 
		LOG_MSG_NO=000000 
		FIELD MESSAGE_V1= 
		FIELD MESSAGE_V2= 
		FIELD MESSAGE_V3= 
		FIELD MESSAGE_V4= 
		FIELD PARAMETER= FIELD 
		ROW=0 
		FIELD FIELD= 
		FIELD SYSTEM=
	}


Из приведенной выше строки как я могу извлечь значение поля MESSAGE field.

Что я уже пробовал:

До сих пор я пробовал это...
Message = function.GetValue("MESSAGE").ToString();
from = Message.IndexOf("FIELD MESSAGE=");
to = Message.LastIndexOf("FIELD LOG_NO=");
Msg = Message.Substring(from, to - from).Replace("FIELD MESSAGE=", "").Trim();


Он прекрасно работает. Но есть ли другой способ сделать это? Например, использование LINQ, LIST, лямбда-выражения, XML и т. д...

John C Rayan

всегда ли поле параметра LOG_NO следует за полем MESSAGE ?

sopi9

Да.

До сих пор я пробовал это...
Сообщение = функция.GetValue ("сообщение").Метод toString();
из сообщений.Метод indexOf("поле " Сообщение"=");
to = сообщение.LastIndexOf ("поле LOG_NO=");
Msg = Сообщение.Подстрока (from, to-from).Заменить ("поле Сообщение=","").();

Он прекрасно работает. Но есть ли другой способ сделать это? Например, использование LINQ, LIST, лямбда-выражения, XML и т. д...

4 Ответов

Рейтинг:
2

John C Rayan

var match = Regex.Match(Message, @"FIELD MESSAGE=(.+?)FIELD LOG_NO").Groups[1].Value;


Рейтинг:
12

sopi9

Спасибо всем за время и внимание. Я использую приведенный ниже код

Сообщение = функция.GetValue ("сообщение").Метод toString();
из сообщений.Метод indexOf("поле " Сообщение"=");
to = сообщение.LastIndexOf ("поле LOG_NO=");
Msg = Сообщение.Подстрока (from, to-from).Заменить ("поле Сообщение=","").();


Рейтинг:
1

NathanRO

string fieldValue= Regex.Match(message, @"(?<=FIELD MESSAGE=)(.*\n?)(?=FIELD LOG_NO=)").Groups[1].Value;


Рейтинг:
0

Maciej Los

Я бы попытался проанализировать такие данные с помощью Linq:

var data = msg.Replace("STRUCTURE ERRMSG", string.Empty)
            .Split(new string[]{"{", "}", "\n"}, StringSplitOptions.RemoveEmptyEntries)
            .Select(x=>new
                {
                    FieldName = x.Split('=')[0].Trim(),
                    FieldValue = x.Split('=').Count() == 1 ? string.Empty : x.Split('=')[1].Trim()
                })
            .ToList();


Выше код возвращает:

FieldName     FieldValue
FIELD TYPE        E 
FIELD ID   
FIELD NUMBER      000 
FIELD MESSAGE     Invalid Referral Link 
FIELD LOG_NO      FIELD 
LOG_MSG_NO        000000 
FIELD MESSAGE_V1   
FIELD MESSAGE_V2   
FIELD MESSAGE_V3   
FIELD MESSAGE_V4   
FIELD PARAMETER   FIELD 
ROW               0 
FIELD FIELD   
FIELD SYSTEM


Примечание: Я бы предложил написать пользовательский класс с помощью Parse метод, позволяющий иметь дело с данными.