C# 如何将文本字符串添加到另一个txt文件中
我有一个包含以下文本的txt文件: MSH^ ~| \&^r3pockerys^050~BCMABU.MED.VA.GOV~DNS^r3pockeryr^^201711081317040500^^RQC~I06^50279320^D^2.5^^美国东北部 QRD^20171108131704-0500^R^I^WQRY^^^^^^ SSN~%ABC123^9A-MED~WA0034^^^^ T 但是我只想要在SSN~%和MED~之后的值 我希望能够从以QRD开头的行中读取数据,然后能够获取SSN~%和MED~之后的任何值,因此该值可以是任何值,我只是使用ABC123和WA0034作为示例 表格1.cs 重新运行模板C# 如何将文本字符串添加到另一个txt文件中,c#,.net,parsing,C#,.net,Parsing,我有一个包含以下文本的txt文件: MSH^ ~| \&^r3pockerys^050~BCMABU.MED.VA.GOV~DNS^r3pockeryr^^201711081317040500^^RQC~I06^50279320^D^2.5^^美国东北部 QRD^20171108131704-0500^R^I^WQRY^^^^^^ SSN~%ABC123^9A-MED~WA0034^^^^ T 但是我只想要在SSN~%和MED~之后的值 我希望能够从以QRD开头的行中读取数据,然后能够获取SSN
假设您逐行读取文件。您可以根据以下正则表达式验证每一行,并提取所需内容
var text = "QRD^20171108131704-0500^R^I^WQRY^^^^SSN~%ABC123^9A-MED~WA0034^^^T";
var rgx = new Regex(@"QRD.+SSN~%(.+)MED~(.+)");
var match = rgx.Match(text);
if (match.Success)
{
Console.WriteLine(match.Groups[1].Value);
Console.WriteLine(match.Groups[2].Value);
}
match.Groups[1]具有ABC123^9A-,match.Groups[2]具有WA0034^^^T。您现在可以对这些文本执行任何操作
正则表达式分解
@QRD.+SSN~%.+MED~+
QRD-以字符串QRD开头
.+-后跟一个或多个字符
SSN~%-后接SSN~%
.+-抓取到组[1]SSN~%和MED之间的一个或多个字符~
医学!-其次是医学~
.+-将队列中的所有其他内容抓取到组[2]
这是我的努力
var input = @"MSH^~|\&^R3POCQUERYS^050~BCMABU.MED.VA.GOV~DNS^R3POCQUERYR^^201711081317040500^^RQC~I06^50279320^D^2.5^^^AL^NE^USA
QRD^20171108131704-0500^R^I^WQRY^^^^SSN~%ABC123^9A-MED~WA0034^^^T" ;
var pattern = @"SSN\~\%([A-Z0-9]+).*MED\~([A-Z0-9]+)";
var matches = Regex.Matches(input, pattern, RegexOptions.Multiline).
Select( m => new { SSN = m.Groups[1].Value, MED = m.Groups[2].Value});
foreach(var m in matches ) {
Console.WriteLine($"SSN = {m.SSN}, MED = {m.MED}");
}
输出
与QRD匹配
输出
你知道这种格式的名称吗?看起来初始部分指定了一些分隔符。它看起来像HL7。按照规则进行解析总是可取的。使用正则表达式很容易在引用或转义规则上失败。这是一条hl7消息,但我不希望任何东西被硬编码。我希望这是动态的。因为文本文件中的文本可能会更改,但格式将始终相同,如:^、~、MED~和SSN~%。我想从QRD行中提取的唯一信息是SSN~%和^之间的字符,以及MED~和^之间的字符。不过,用HL7方式分解它是唯一安全的方法。寻找一个语法分析器或字符串。自己拆分它。我不希望任何东西被硬编码,我希望它是动态的。因为文本文件中的文本可能会更改,但格式将始终相同,如:^、~、MED~和SSN~%。我想从QRD行中提取的唯一信息是SSN~%和^之间的字符,以及MED~和^之间的字符;在你说你想提取SSN和MED之间的东西之前。尽管如此,这个正则表达式并不是硬编码的,并且仍然有所有您需要编辑的内容来修复您的需要。
var text = "QRD^20171108131704-0500^R^I^WQRY^^^^SSN~%ABC123^9A-MED~WA0034^^^T";
var rgx = new Regex(@"QRD.+SSN~%(.+)MED~(.+)");
var match = rgx.Match(text);
if (match.Success)
{
Console.WriteLine(match.Groups[1].Value);
Console.WriteLine(match.Groups[2].Value);
}
var input = @"MSH^~|\&^R3POCQUERYS^050~BCMABU.MED.VA.GOV~DNS^R3POCQUERYR^^201711081317040500^^RQC~I06^50279320^D^2.5^^^AL^NE^USA
QRD^20171108131704-0500^R^I^WQRY^^^^SSN~%ABC123^9A-MED~WA0034^^^T" ;
var pattern = @"SSN\~\%([A-Z0-9]+).*MED\~([A-Z0-9]+)";
var matches = Regex.Matches(input, pattern, RegexOptions.Multiline).
Select( m => new { SSN = m.Groups[1].Value, MED = m.Groups[2].Value});
foreach(var m in matches ) {
Console.WriteLine($"SSN = {m.SSN}, MED = {m.MED}");
}
SSN = ABC123, MED = WA0034
var input = @"MSH^~|\&^R3POCQUERYS^050~BCMABU.MED.VA.GOV~DNS^R3POCQUERYR^^201711081317040500^^RQC~I06^50279320^D^2.5^^^AL^NE^USA
QRD^20171108131704-0500^R^I^WQRY^^^^SSN~%ABC123^9A-MED~WA0034^^^T";
var pattern = @"SSN\~\%([A-Z0-9]+).*MED\~([A-Z0-9]+)";
var matches = input
.Split()
.Where(l => l.StartsWith("QRD"))
.Select(l => Regex.Matches(l, pattern).Select(m => new { SSN = m.Groups[1].Value, MED = m.Groups[2].Value }));
foreach (var groups in matches)
{
foreach (var g in groups)
{
Console.WriteLine($"SSN = {g.SSN}, MED = {g.MED}");
}
}
SSN = ABC123, MED = WA0034