从一个简单的数据模型开始:
public class LXRecord
{
public string ItemNumber { get; set; }
public string LastName { get; set; }
public string Date { get; set; }
public List<string> Errors { get; set; }
public LXRecord()
{
Errors = new List<String>();
}
}
定义你的重要标记:
public static class Tokens
{
public const string TOKEN_SPLITTER = "*";
public const string NEW_RECORD = "LX";
public const string ITEM_NUMBER = "CLP";
public const string LAST_NAME = "NM1";
public const string DATE = "REF";
public const string ERROR = "LQ";
}
遍历这些行,在令牌上做一个 switch/case,LXRecord
当你看到“LX”标志时就开始一个新的:
List<LXRecord> records = new List<LXRecord>();
LXRecord currentRecord = null;
foreach(string line in lines)
{
int tokenIndex = line.IndexOf(Tokens.TOKEN_SPLITTER);
if (tokenIndex < 1 || tokenIndex == line.Length - 1) //no token or no value?
continue;
string token = line.Substring(0, tokenIndex);
string value = line.Substring(tokenIndex + 1);
switch(token)
{
case(Tokens.NEW_RECORD) :
currentRecord = new LXRecord();
records.Add(currentRecord);
break;
case(Tokens.ITEM_NUMBER) :
currentRecord.ItemNumber = value;
break;
case(Tokens.LAST_NAME) :
currentRecord.LastName = value;
break;
case(Tokens.DATE) :
currentRecord.Date = value;
break;
case(Tokens.ERROR) :
currentRecord.Errors.Add(value);
break;
}
}
请注意,这样您可以相对轻松地忽略不支持的标志、添加新标志或添加解析(例如,ItemNumber
可以使用Int32.Parse
并将其存储为整数,或者“日期”可以存储 a DateTime
)在这种情况下,我选择存储错误List<String>
,但如果你愿意,你可以用逗号分隔它。如果内容还包含第二个星号,我也避免拆分*
字符。
编辑:根据您的评论,您可以在 or 中进行一些更复杂/专业的解析case
或移至另一种方法。而不是我上面的“LAST_NAME”的情况,你可以有:
case(Tokens.LAST_NAME) :
ParseName(currentRecord, value);
break;
在哪里ParseName
:
public static void ParseName(LXRecord record, string value)
{
int tokenIndex = value.IndexOf(Tokens.TOKEN_SPLITTER);
if (tokenIndex < 1 || tokenIndex == value.Length - 1) //no last name and first name?
{
record.LastName = value;
}
else
{
record.LastName = value.Substring(0, tokenIndex);
record.FirstName = value.Substring(tokenIndex + 1);
}
}
令牌检查可能会在那里进行调整,但它应该给你一个好主意。