Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将文本字符串添加到另一个txt文件中_C#_.net_Parsing - Fatal编程技术网

C# 如何将文本字符串添加到另一个txt文件中

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

我有一个包含以下文本的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

重新运行模板


假设您逐行读取文件。您可以根据以下正则表达式验证每一行,并提取所需内容

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