0

我有一个 HL7 文件,例如:

MSH|^~\&|ABC|000|ABC|ABC|0000||ABC|000|A|00
PID|1|000|||ABC||000|A||||||||||
OBR|1|||00||00|00|||||||||||ABC|00|0|0||||A|||||00||ABC|7ABC||ABC
OBX|1|ABC|ABC|1|SGVsbG8=
OBX|2|ABC|ABC|1|XYTA
OBX|3|ABC|ABC|1|UYYA

我必须只阅读 OBX 段并在第 5 个管道 (|) 之后获取文本。

目前我正在这样做:

 StreamReader reader = new StreamReader(@"C:\Users\vemarajs\Desktop\HL7\Ministry\HSHS.txt");
 string strTest = reader.ReadToEnd();
 string OBX1 = strTest.Split('\n')[3];
 File.AppendAllText(@"C:\Users\vemarajs\Desktop\Test\OBX.txt", OBX1 + Environment.NewLine);
 List<string> list = new List<string>();
 using (reader)
 {
    string line;
    while ((line = reader.ReadLine()) != null)
    {
       list.Add(line);
       if (line.StartsWith("OBX|") == true)
       {
          string txt = line.Split('|')[5];
          File.AppendAllText(@"C:\Users\vemarajs\Desktop\Test\test.txt", txt+Environment.NewLine);
       }
       else
       {
          //string x = line + Environment.NewLine + OBX1.Distinct();
          File.AppendAllText(@"C:\Users\vemarajs\Desktop\Test\newtest.txt", line + Environment.NewLine);   
       }

File.AppendAllText(@"C:\Users\vemarajs\Desktop\Test\newtest.txt", OBX1.Distinct().ToList() + Environment.NewLine);

这会在元素 5 处提取每个 OBX 段的内容(在 5 个管道之后)并写出一个名为 test.text 的文件,在我的 else 语句中,我试图通过删除 OBX|2 和 OBX|3 来修改原始 HL7 文件只有一个 OBX|1,因为我们希望 HL7 文件中的 OBX 段数达到 40 或更多,并且我们不希望在将消息返回到其消息框时保留这些段数。

如何在不说行号为 4 的情况下获得 OBX|1 的第一次出现,这可能会改变。

这是工作代码:

     StreamReader reader = new StreamReader(@"C:\Users\vemarajs\Desktop\HL7\Ministry\HSHS.txt");
     string strTest = reader.ReadToEnd();
     reader.DiscardBufferedData();
     reader.BaseStream.Seek(0, SeekOrigin.Begin);
     reader.BaseStream.Position = 0;
     string OBXstr = string.Empty;
     string x = null;
     string fileName = Guid.NewGuid().ToString() + ".txt";
     StringBuilder sb = new StringBuilder();
     List<string> list = new List<string>();
     using (reader)
     {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
           list.Add(line);
           if (line.StartsWith("OBX|") == true)
           {
              string txt = line.Split('|')[5];
              File.AppendAllText(@"C:\Users\vemarajs\Desktop\Test\"+fileName, txt + Environment.NewLine);
           }
           else
           {
              sb.AppendLine(line);
           }
        }
        int obx1Index = 0;
        int obx2Index = 0;
        var obx1IDR = "\r" + "OBX" + "|" + "1";
        var obx1IDN = "\n" + "OBX" + "|" + "1";
        var obx2IDR = "\r" + "OBX" + "|" + "2";
        var obx2IDN = "\n" + "OBX" + "|" + "2";
        obx1Index = strTest.IndexOf(obx1IDN);
        if (obx1Index < 1)
           obx1Index = strTest.IndexOf(obx1IDR);

        obx2Index = strTest.IndexOf(obx2IDN);
        if (obx2Index < 1)
           obx2Index = strTest.IndexOf(obx2IDR);
        if (obx1Index > 0)
        {
           OBXstr = strTest.Substring(obx1Index, obx2Index - obx1Index - 1);
           OBXstr = OBXstr.Replace(strTest.Substring(obx1Index, obx2Index - obx1Index - 1).Split('|')[5], fileName);
        }
     }
     sb.Append(OBXstr);
     x = sb.ToString();
     File.WriteAllText(@"C:\Users\vemarajs\Desktop\Test\newtest.txt", x);
     reader.Close();
4

2 回答 2

0

你的代码有很多缺陷。

1)这假设 OBX1 始终是第 4 行,您将希望将其移动到循环和 if 逻辑中。

string OBX1 = strTest.Split('\n')[3];

2) 是的,您在 else 语句中每隔一行都会写入变量 OBX1。

3)当你说你想要一个文件/消息时,你正在写入多个文件。

你可能想要更多类似的东西

 StreamReader reader = new StreamReader(@"C:\Users\vemarajs\Desktop\HL7\Ministry\HSHS.txt");

 File.AppendAllText(@"C:\Users\vemarajs\Desktop\Test\OBX.txt", OBX1 + Environment.NewLine);
 List<string> list = new List<string>();
 using (reader)
 {
    string line;
    while ((line = reader.ReadLine()) != null)
    {
       list.Add(line);
       if (line.StartsWith("OBX|1") == true)
       {
          File.AppendAllText(@"C:\Users\vemarajs\Desktop\Test\test.txt", line + Environment.NewLine);
       }
       else if (line.StartsWith("OBX|") == true)
       {
          // Don't write
       }
       else
       {
          File.AppendAllText(@"C:\Users\vemarajs\Desktop\Test\test.txt", line + Environment.NewLine);
       }
于 2013-09-18T00:21:32.150 回答
0

您可能想看看NHapi,它允许您将 HL7 消息解析为对象结构,然后操作对象。可以在这里找到一个解析示例,我认为它应该是可用的。我有使用 HAPI 的个人经验,它是解析器库的原始基于 Java 的版本,它确实使处理 HL7 解析变得容易。

于 2013-11-14T09:12:02.733 回答