C# - 棘手的串行原始数据必须存储到结构中
C# - Tricky serial raw data must be stored to a struct
我无法从串行服务器获取的原始数据中提取数据。 RegEx 不是我的游戏,我想转来转去……好吧,这是我的服务器响应的模板:
TIME STAMP dd/MM/YY HH:mm:ss
SAMPLING DATA IN SLOT 1 - COMS
Dev 1
Par 1: XXXXXX //Signed integers
.
.
.
Par n: XXXXXX //Signed integers
.
.
.
.
.
Dev n
Par 1: XXXXXX //Signed integers
.
.
.
Par n: XXXXXX //Signed integers
DATA SLOT 1 SAMPLED
.
.
.
.
.
.
SAMPLING DATA IN SLOT n - COMS
Dev n
Par 1: XXXXXX //Signed integers
.
.
.
Par n: XXXXXX //Signed integers
.
.
.
.
.
Dev n
Par 1: XXXXXX //Signed integers
.
.
.
Par n: XXXXXX //Signed integers
DATA SLOT n SAMPLED
ALL BOARDS COMPLETED
我想实现的是将上面的数据存储到Structs(C#)
以下是我取得的一些成就:
string strRegex = @"Par([^:]*): ([^\s]*)";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @DataStream;
foreach (Match myMatch in myRegex.Matches(strTargetString))
{
if (myMatch.Success)
{
SetText(myMatch.Value + Environment.NewLine);
}
}
DataStream = "";
这将提取 Par n: XXXXXX
真实世界的输出是:
SAMPLING DATA IN SLOT 3 - COMS
Dev 1
Par 0: 5000
Par 6: 1041
Par 7: 1041
Par 8: 1032
Par 19: 0
Par 20: 0
Par 21: 0
Par 28: -2147483648
Par 29: -2147483648
......
==============编辑 w/SOLUTION(伊戈尔的回答)===================== =
谢谢伊戈尔!我做了一些(愚蠢的)调整,所以它包含了 SLOT 信息。为了让其他 C# 开发人员知道,我使用了以下代码(必须检查多行):
string strRegex = @"(SLOT [0-9] - COMS )?\s*(\w+)\s+(\d+)(?::\s+(-?\d+))?\s*$";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);
考虑使用此正则表达式来解析 'real world output':^\s*(\w+)\s+(\d+)(?::\s+(-?\d+))?\s*$
它不会匹配空行和状态消息。
以下是其余的分组:
Input
' Dev 1 ' 'Dev' '1' ''
' Par 0: 5000 ' 'Par' '0' '5000'
' Par 6: 1041 ' 'Par' '6' '1041'
' Par 7: 1041 ' 'Par' '7' '1041'
' Par 8: 1032 ' 'Par' '8' '1032'
' Par 19: 0 ' 'Par' '19' '0'
' Par 20: 0 ' 'Par' '20' '0'
' Par 21: 0 ' 'Par' '21' '0'
' Par 28: -2147483648 ' 'Par' '28' '-2147483648'
' Par 29: -2147483648 ' 'Par' '29' '-2147483648'
如果您打算熟悉正则表达式,this is good starting point。
干杯!
我无法从串行服务器获取的原始数据中提取数据。 RegEx 不是我的游戏,我想转来转去……好吧,这是我的服务器响应的模板:
TIME STAMP dd/MM/YY HH:mm:ss
SAMPLING DATA IN SLOT 1 - COMS
Dev 1
Par 1: XXXXXX //Signed integers
.
.
.
Par n: XXXXXX //Signed integers
.
.
.
.
.
Dev n
Par 1: XXXXXX //Signed integers
.
.
.
Par n: XXXXXX //Signed integers
DATA SLOT 1 SAMPLED
.
.
.
.
.
.
SAMPLING DATA IN SLOT n - COMS
Dev n
Par 1: XXXXXX //Signed integers
.
.
.
Par n: XXXXXX //Signed integers
.
.
.
.
.
Dev n
Par 1: XXXXXX //Signed integers
.
.
.
Par n: XXXXXX //Signed integers
DATA SLOT n SAMPLED
ALL BOARDS COMPLETED
我想实现的是将上面的数据存储到Structs(C#)
以下是我取得的一些成就:
string strRegex = @"Par([^:]*): ([^\s]*)";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @DataStream;
foreach (Match myMatch in myRegex.Matches(strTargetString))
{
if (myMatch.Success)
{
SetText(myMatch.Value + Environment.NewLine);
}
}
DataStream = "";
这将提取 Par n: XXXXXX
真实世界的输出是:
SAMPLING DATA IN SLOT 3 - COMS
Dev 1
Par 0: 5000
Par 6: 1041
Par 7: 1041
Par 8: 1032
Par 19: 0
Par 20: 0
Par 21: 0
Par 28: -2147483648
Par 29: -2147483648
......
==============编辑 w/SOLUTION(伊戈尔的回答)===================== =
谢谢伊戈尔!我做了一些(愚蠢的)调整,所以它包含了 SLOT 信息。为了让其他 C# 开发人员知道,我使用了以下代码(必须检查多行):
string strRegex = @"(SLOT [0-9] - COMS )?\s*(\w+)\s+(\d+)(?::\s+(-?\d+))?\s*$";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);
考虑使用此正则表达式来解析 'real world output':^\s*(\w+)\s+(\d+)(?::\s+(-?\d+))?\s*$
它不会匹配空行和状态消息。 以下是其余的分组:
Input
' Dev 1 ' 'Dev' '1' ''
' Par 0: 5000 ' 'Par' '0' '5000'
' Par 6: 1041 ' 'Par' '6' '1041'
' Par 7: 1041 ' 'Par' '7' '1041'
' Par 8: 1032 ' 'Par' '8' '1032'
' Par 19: 0 ' 'Par' '19' '0'
' Par 20: 0 ' 'Par' '20' '0'
' Par 21: 0 ' 'Par' '21' '0'
' Par 28: -2147483648 ' 'Par' '28' '-2147483648'
' Par 29: -2147483648 ' 'Par' '29' '-2147483648'
如果您打算熟悉正则表达式,this is good starting point。
干杯!