Member 11776570 Ответов: 2

Нужно отделить эти значения, вызванные в C# в visual studio


У нас есть 3 записи этого типа

!QUANT CMP=1,AMY=1,LIP=1,CBC=1,ESR=1,RF=1;!CALL W;ME6E;5466;;;!CALLED ME6E;5466
!CALLED-;08/29/2013;09:59;ar;LDKH1;;W;!CALLED1 ME6E;5466;08/28/2018;23:31;ar;LT
!CALLED1-LC1;;W;


нам нужен такой выход

W;ME6E;5466;;;
ME6E;5466;08/29/2013;09:59;ar;LDKH1;;W;
ME6E;5466;08/28/2013;23:31;ar;LTLC1;;W;


Что я уже пробовал:

Я попробовал этот код, но он все еще не работает должным образом

try
            {
                string strModuleName = string.Empty;
                strModuleName = parameters["modulename"].ToString();

 

                DataSet dsModuleData = new DataSet(strModuleName);
                DataTable dtClinicaldata = GetPatientData(connection, parameters, true);
                DataTable dtValidation = new DataTable();
                dtValidation = CreateValidationDataTable("xclinicalvalidations");
                List<string> allRows = new List<string>();
                 foreach (DataRow dr in dtClinicaldata.Rows)

 

                {
                    var uniqueOrderIds = (from r in dtClinicaldata.AsEnumerable()
                             select r["OrderId"]).Distinct().ToList();
                    
                    foreach(var i_row in uniqueOrderIds)
                    {
                        string orderid = Convert.ToString(i_row);
                        var tagcomments = (from r in dtClinicaldata.AsEnumerable()
                                      where r.Field<string>("OrderId") == orderid
                                      select r["TagComment"]).ToList();
           
                        int i = 0;
                        string strtagcomment = "";
                        foreach (var tagcomm in tagcomments)
                        {
                           string temptagcomment = Convert.ToString(tagcomm);

 

                            if (temptagcomment.Substring(0, 5).ToUpper() != "!CALL")
                            {

 

                                var indexofcall = temptagcomment.ToUpper().IndexOf("!CALL");
                                temptagcomment = temptagcomment.Substring(indexofcall);
                            }

 


                            if (temptagcomment.Substring(0, 7).ToUpper() == "!CALLED")
                            {

 

                                var callerstring = temptagcomment.Substring(0, temptagcomment.IndexOf("-"));
                                if (strtagcomment.ToUpper().Contains(callerstring.ToUpper()))
                                {
                                    temptagcomment = temptagcomment.Substring(callerstring.Length);
                                }
                                

 

                            }

 

                            temptagcomment = temptagcomment.Replace("\0", string.Empty);
                            strtagcomment = strtagcomment + temptagcomment;

 

                        }

 

                        string[] allstring = strtagcomment.ToUpper().Split(new[] { "!CALLED"}, StringSplitOptions.RemoveEmptyEntries);

 

                        foreach (var callstrin in allstring)
                        {

 

                            var fields = callstrin.Split(new char[] { ';'} ,StringSplitOptions.None);

 

                        }

 

                        //allRows.Add(strtagcomment);

 

                    }
                    
                }

 

                // Do data processing here.
                dtClinicaldata.TableName = strModuleName;
                dsModuleData.Tables.Add(dtValidation);
                dsModuleData.Tables.Add(dtClinicaldata);

 

                return dsModuleData;
            }


Любой может мне в этом помочь.

Garth J Lancaster

Сколько записей вы получаете одновременно ? ваш "образец" предполагает три (3), но можете ли вы получить 1000, 10 000 и т. д. ?

Находятся ли эти "строки" в файле или буфере размера <n>

BillWoodruff

чтобы помочь вам в этом, вам нужно четко описать, какие синтаксические элементы в данных являются инвариантными.

2 Ответов

Рейтинг:
12

RickZeeland

Может быть, это поможет вам начать:

string test = @"!QUANT CMP=1,AMY=1,LIP=1,CBC=1,ESR=1,RF=1;!CALL W;ME6E;5466;;;!CALLED ME6E;5466!CALLED-;08/29/2013;09:59;ar;LDKH1;;W;!CALLED1 ME6E;5466;08/28/2018;23:31;ar;LT!CALLED1-LC1;;W;";

var result = test.Split(new[] { "!CALL ", "!CALLED" }, StringSplitOptions.None);

for (int i = 1; i < result.Length; i++)
{
    Debug.Print(result[i]);
}


Member 11776570

хорошо, но тогда я должен разделить эти данные на ";" Также

как я это сделал

по каждому элементу (ВАР callstrin в allstring)
{
var fields = callstrin.Split(new char[] { ';'} ,StringSplitOptions.None);
}

Но все равно не получаю нужных данных.

RickZeeland

Я думаю, что есть какая-то связь между разделенными предметами, вероятно, обозначенная следующим номером.

Member 11776570

Нет, нет никакого фиксированного числа для CALLED, есть 1 или больше, чем это в отдельных записях значений CALLED.

Рейтинг:
10

Maciej Los

Попробовать это:

string test = @"!QUANT CMP=1,AMY=1,LIP=1,CBC=1,ESR=1,RF=1;!CALL W;ME6E;5466;;;!CALLED ME6E;5466!CALLED-;08/29/2013;09:59;ar;LDKH1;;W;!CALLED1 ME6E;5466;08/28/2018;23:31;ar;LT!CALLED1-LC1;;W;";

string pattern = @"!CALLED..?";
Regex r = new Regex(pattern);
test = test.Substring(test.IndexOf("!CALL ")+6, test.Length - test.IndexOf("!CALL ")-6);
var lines = test.Split(new string[]{" "}, StringSplitOptions.RemoveEmptyEntries)
	.Select(x => r.Replace(x, ""))
	.ToList();

foreach(string s in lines)
	Console.WriteLine($"{s}\n");


Результат:
W;ME6E;5466;;;

ME6E;5466;08/29/2013;09:59;ar;LDKH1;;W;

ME6E;5466;08/28/2018;23:31;ar;LTLC1;;W;