c# ile astm mesajını split ve parse yapmak.

C# (C Sharp) veya Java ile ilgili konuları buraya yazabilirsiniz.
Cevapla
Kullanıcı avatarı
sarp_halit
Üye
Mesajlar: 239
Kayıt: 17 Ara 2003 04:30
Konum: Cennet Fethiye
İletişim:

c# ile astm mesajını split ve parse yapmak.

Mesaj gönderen sarp_halit » 01 May 2016 10:12

Merhaba arkadaşlar. Çalıştığım hastanede otomasyon firması ile yolları ayırdık :( bu yüzden de yeni gelen cihazların bağlantısı bana kaldı. C# ile cihaz bağlantısı kurmaya çalışıyorum. cihazdan com port üzerinden veri alabiliyor. ASTM ile ilgili bir sürü doküman okudum ama cihazdan aldığım mesajı ayırıp hasta ve sonuç bilgilerini alamadım.

Örnek olarak olarak gelen mesaj bu:

Kod: Tümünü seç

<ENQ>
<STX>1H|\^&|||H7600^1|||||host|RSUPL^BATCH|P|1<CR>P|1|||||||U||||||^<CR>O|1|            mithat|0^50010^010^^S1^SC|^^^687^\^^^685^\^^^418^\^^^717^\^^^19^\^^^698^\^^^700^\^^^690^|R||||||N||||1|||||||20160430020618|||F<CR>C|1|I|                          <ETB>BE<CR><LF><STX>2    ^                         ^                    ^               ^          |G<CR>R|1|^^^687/|12.5|U/l||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|2|^^^685/|12.7|U/l||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|3|^^^418/|35.1|mg/dl||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|4|^^^<ETB>4D<CR><LF><STX>3717/|101.5|mg/dl||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|5|^^^19/|0.186|mg/dl||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|6|^^^698/|10.48|mg/dl||H||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|7|^^^700/|4.0|mg/dl||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|8|^^^690/|0.67|mg\u00021H|\\^&|||H7600^1|||||host|RSUPL^REAL|P|1\rP|1|||||||U||||||^\rO|1|    colin james taylor|0^50011^011^^S1^SC|^^^435^\\^^^687^\\^^^685^\\^^^418^\\^^^59^\\^^^798^\\^^^717^\\^^^19^\\^^^690^\\^^^781^|R||||||N||||1|||||||20160427184217|||F\rC|1|I|            \u001783\r\n\u0004/dl||L||F||bmserv||<ETB>C1<CR><LF><STX>4|P1<CR>C|1|I|0|I<CR>L|1|N<CR><ETX>44<CR><LF><EOT>
cihaz bana enq gönderiyor ben ona ack gönderebiliyorum. sonrasında da başlık kısmından başlayarak bana bütün verileri gönderiyor. burada beni bağlayan alanlar RSUPL^BATCH ( verinin ne olduğu - toplu sonuc, talep, gerçek sonuc gibi), mithat ( hasta adı- bağlantıyı kurabilirsek barkod numarası gelecek) ve ^^^685/|12.7|U/l ( cihaz test kodu, sonuç, sonucun birimi)

Bu konuda daha önce deneyimi olan var mı? bu işin yolu yordamı nedir?

Teşekkürler.
Fethiye den herkese sevgiler ...
X))@:>

Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1061
Kayıt: 01 Nis 2007 01:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: c# ile astm mesajını split ve parse yapmak.

Mesaj gönderen Lost Soul » 03 May 2016 10:33

Klasik String Parçalama Örneği:

Kod: Tümünü seç

using System.IO;
using System;

class Program
{
    static void Main()
    {
        String veri = @"<ENQ>
<STX>1H|\^&|||H7600^1|||||host|RSUPL^BATCH|P|1<CR>P|1|||||||U||||||^<CR>O|1
|            mithat|0^50010^010^^S1^SC|^^^687^\^^^685^\^^^418^\^^^717^\^^^19^\^^^698^\^^^700^\^^^690^|R||||||N||||1|||||||20160430020618||
|F<CR>C|1|I|                          <ETB>BE<CR><LF><STX>2    ^                         ^                    ^               ^          |G<CR>R|1|^^^687/|12.5|U/l||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|2|^^^685/|12.7|U/l||N||F||bmserv|
||P1<CR>C|1|I|0|I<CR>R|3|^^^418/|35.1|mg/dl||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|4|^^^<ETB>4D<CR><LF><STX>3717/|101.5|mg/dl||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|5|^^^19/|0.186|mg/dl||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|6
|^^^698/|10.48|mg/dl||H||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|7|^^^700/|4.0|mg/dl||N||F||bmserv|||P1<CR>C|1|I|0|I<CR>R|8|^^^690/|0.67|mg\u00021H|\\^&|||H7600^1||
|||host|RSUPL^REAL|P|1\rP|1|||||||U||||||^\rO|1|    colin james taylor|0^50011^011^^S1^SC|^^^435^\\^^^687^\\^^^685^\\^^^418^\\^^^59^\\^^^798^\\^^^717^\\^^^19^\\^^^690^\\^^^781^|R|
|||||N||||1|||||||20160427184217|||F\rC|1|I|            \u001783\r\n\u0004/dl||L||F||bmserv||<ETB>C1<CR><LF><STX>4|P1<CR>C|1|I|0
|I<CR>L|1|N<CR><ETX>44<CR><LF><EOT>
";
var values = veri.Split(new []{'|'}, StringSplitOptions.None);
foreach(var item in values ) {
    Console.WriteLine(item);
}

        
    
    }
}
Kod Testi Tıkla

Tag ile Kod Parçalama Örneği

Ayrıca Regex ile de rahatlıkla yapabilirsiniz.
En son Lost Soul tarafından 04 May 2016 09:56 tarihinde düzenlendi, toplamda 2 kere düzenlendi.

Kullanıcı avatarı
sarp_halit
Üye
Mesajlar: 239
Kayıt: 17 Ara 2003 04:30
Konum: Cennet Fethiye
İletişim:

Re: c# ile astm mesajını split ve parse yapmak.

Mesaj gönderen sarp_halit » 03 May 2016 01:25

Teşekkür ederim. Substring, indexof ve split fonksiyonlaarıyla hallettim. Pc başına geçince sizinle paylaşacağım.
Fethiye den herkese sevgiler ...
X))@:>

Kullanıcı avatarı
sarp_halit
Üye
Mesajlar: 239
Kayıt: 17 Ara 2003 04:30
Konum: Cennet Fethiye
İletişim:

Re: c# ile astm mesajını split ve parse yapmak.

Mesaj gönderen sarp_halit » 30 May 2016 01:02

İlgilenen olur da ihtiyacı olur diye aşağıda kodları yazıyorum.

Kod: Tümünü seç

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            string str = sp.ReadExisting();
            veriyiIsle(str);
        }

        private void veriyiIsle(string str)
        {
            try
            {
                gelenData += Display(str);
                
                if (gelenData.StartsWith("<ENQ>"))
                {
                    richTextBox1.Text += Environment.NewLine + "Cihazdan Gelen: " + Display(enq) + Environment.NewLine;
                    ACK();
                    richTextBox1.Text += Environment.NewLine + "Cihaza Gönerilen: " + Display(ack) + Environment.NewLine;
                }

                if (gelenData.EndsWith("<ACK>"))
                {
                    //cihazaIstemGonder(barkod);
                    //ACK();                    
                    sp.Write(eot);
                    richTextBox1.Text += Environment.NewLine + "Cihaza Gönerilen: " + Display(eot) + Environment.NewLine;
                }
                if (gelenData.EndsWith("<LF>"))
                {
                    richTextBox1.Text += Environment.NewLine + "Cihazdan Gelen: " + Display(lf) + Environment.NewLine;
                    ACK();
                }                
                
                if (gelenData.EndsWith("<EOT>"))
                {
                    MesajIsle2(gelenData);
                    richTextBox1.Text += Environment.NewLine + "Cihazdan Gelen: ";
                    richTextBox1.Text += gelenData;
                    richTextBox1.Text += Environment.NewLine;
                    ACK();
                    gelenData = "";

                }
            }
            catch (Exception hata)
            {
                listBox.Items.Add(hata.Message);
            }
        }

        private void MesajIsle2(string gelenData)
        {
            try
            {
                richTextBox1.Text += gelenData;
                richTextBox1.Text += Environment.NewLine;
                int baslikBaslangicDegeri = gelenData.IndexOf("<STX>");
                int baslikBitisDegeri;
                int mesajBaslangicDegeri;
                int mesajBitisDegeri;
                if (gelenData.Contains("<ETB>"))
                {
                    baslikBitisDegeri = gelenData.IndexOf("<ETB>") + 5;
                    mesajBaslangicDegeri = baslikBitisDegeri;
                    mesajBitisDegeri = gelenData.Length - baslikBitisDegeri;
                }
                else if (gelenData.Contains("<ETX>"))
                {
                    baslikBitisDegeri = gelenData.IndexOf("<ETX>");
                    mesajBaslangicDegeri = 0;
                    mesajBitisDegeri = baslikBitisDegeri;
                }
                else
                {
                    baslikBitisDegeri = -1;
                    mesajBaslangicDegeri = -1;
                    mesajBitisDegeri = -1;
                }
                string komut;
                if (baslikBitisDegeri > 0)
                {
                    baslik = gelenData.Substring(baslikBaslangicDegeri, baslikBitisDegeri - baslikBaslangicDegeri + 5);
                    baslikDegerleri = baslik.Split('|');
                    komut = baslikDegerleri[10].ToString();
                    switch (komut)
                    {
                        case "RSUPL^REAL":
                            string barkodlar = string.Empty;
                            mesaj = gelenData.Substring(mesajBaslangicDegeri, mesajBitisDegeri);
                            mesajIcerik = mesaj.Substring(mesaj.IndexOf("<STX>"), mesaj.Length - mesaj.IndexOf("<STX>"));
                            barkodlar = baslikDegerleri[15].ToString().Trim();
                            sorguParametreleri = barkodlar.Split('^');
                            barkod = sorguParametreleri[1].TrimStart('^').Trim().ToString();
                            sonucKaydet(barkod.Trim(), mesaj);
                            break;
                        case "RSUPL^BATCH":
                            mesaj = gelenData.Substring(mesajBaslangicDegeri, mesajBitisDegeri);
                            mesajIcerik = mesaj.Substring(mesaj.IndexOf("<STX>"), mesaj.Length - mesaj.IndexOf("<STX>"));
                            string barkodAyir = string.Empty;
                            //barkod = baslikDegerleri[15].ToString();
                            barkodAyir = baslikDegerleri[15].ToString();
                            sorguParametreleri = barkodAyir.Split('^');
                            barkod = sorguParametreleri[1].TrimStart('^').Trim().ToString();
                            sonucKaydet(barkod.Trim(), mesaj);
                            break;
                        case "TSREQ^REAL":
                            mesaj = baslik;
                            //mesajIcerik = mesaj.Substring(mesaj.IndexOf("<STX>"), mesaj.Length - mesaj.IndexOf("<ETX>"));
                            string barkodBilgisi = string.Empty;
                            barkodBilgisi = baslikDegerleri[15].ToString();
                            sorguParametreleri = barkodBilgisi.Split('/');
                            barkod = sorguParametreleri[1].TrimStart('/').Trim().PadLeft(22).ToString();
                            sequence = !string.IsNullOrEmpty(sorguParametreleri[2].Trim().ToString())? sorguParametreleri[2].Trim().ToString():"0";
                            _rakNo = 0;//Convert.ToInt32(sorguParametreleri[4].ToString());
                            pozisyon = sorguParametreleri[4].Trim().ToString();
                            checkSum = GetCheckSumValue(gelenData);
                            //sp.Write(enq);
                            cihazaIstemGonder(barkod);
                            sp.Write(eot);
                            richTextBox1.Text += Environment.NewLine + "Cihaza Gönerilen: " + Display(eot) + Environment.NewLine;
                            break;
                        default:
                            listBox.Items.Add("Cihazdan tanımlanamayan veri geldi. -> " + komut);
                            break;
                    }
                }

            }
            catch (Exception hata)
            {
                listBox.Items.Add(hata.Message);
            }
        }
bilgi paylaştıkça çoğalır ...
Fethiye den herkese sevgiler ...
X))@:>

Cevapla