Как преобразовать входную строку в таблицу данных

#c# #.net

Вопрос:

Данные:

номер товара: 223344; trn_id: 112233; статус:доставлено

Таблица Данных :

предметно trn_id Статус
223344 112233 доставлен

Я хочу преобразовать входные данные в таблицу данных, чтобы мне было легко фильтровать данные в таблице данных на основе элемента.

 foreach (DataRow row2 in responcedt.Rows)
{
    string[] lines = new string[] { row2.Field<string>("ResponseMsg") } ;
    foreach (var line in lines)
    {
        string[] split = line.Split(';');
        DataRow row1 = table.NewRow();
        row1.SetField(itemno, split[0]);
        row1.SetField(trn_id, split[1]);
        row1.SetField(status, split[2]);
        table.Rows.Add(row1);
    }
}
 

Комментарии:

1. нормальный class(object) еще проще фильтровать, так зачем его использовать datatable ?

2. Лучше создать класс со свойством и использовать лямбду.

3. о , каждый день появляется 1000 записей … поэтому я хочу отфильтровать значение элемента в этом процессе.в дальнейшем.

4. Мой подход к этой ситуации был бы следующим: «как разделить отдельный ключ:значения?», затем «как отделить ключ от значения?», а затем «как создать таблицу данных с колумами для набора ключей?» прежде чем, наконец, «как мне заполнить таблицу данных значениями?» — как далеко вы продвинулись в этом процессе?

5. каков формат данных? это json из api ?

Ответ №1:

Попробуй последовать за мной. При чтении из файла замените StringReader на StreamReader :

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            string pattern = @"(?'key'[^:] ):(?'value'[^;] );?";
            string input =
                "itemno: 223344; trn_id: 112233; status:deliveredn"  
                "itemno: 223344; trn_id: 112233; status:deliveredn"  
                "itemno: 223344; trn_id: 112233; status:deliveredn"  
                "itemno: 223344; trn_id: 112233; status:deliveredn";

            StringReader reader = new StringReader(input);
            string line = "";
            int row = 0;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0)
                {
                    MatchCollection matches = Regex.Matches(line, pattern);
                    var keyValues = matches.Cast<Match>().Select(x => new { key = x.Groups["key"].Value, value = x.Groups["value"].Value.Trim() }).ToList();
                    if (  row == 1)
                    {
                        foreach (var keyvalue in keyValues)
                        {
                            dt.Columns.Add(keyvalue.key, typeof(string));
                        }
                    }
                    DataRow newRow = dt.Rows.Add();
                    foreach (var keyvalue in keyValues)
                    {
                        newRow[keyvalue.key] = keyvalue.value;
                    }
                }
            }


        }
    }
}
 

Ответ №2:

Сначала превратите нужную строку в a dictionary , а затем перейдите по словарю, сопоставьте каждый из его элементов с a column и поместите каждый созданный столбец в a row , а в конце строки в a datatable .

 string lines = "itemno: 223344; trn_id: 112233; status:deliveredn"  
     "itemno: 223344; trn_id: 112233; status:deliveredn"  
     "itemno: 223344; trn_id: 112233; status:deliveredn";
DataTable dataTable = new DataTable();

int counter = 0;
foreach (var line in lines.Split('n'))
{
   var dict = line.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
     .Select(part => part.Split(':'))
     .ToDictionary(split => split[0], split => split[1]);


   DataRow dataRow = dataTable.NewRow();
   foreach (var key in dict.Keys)
   {
      if(counter == 0)
      {
         DataColumn column = new DataColumn();
         column.DataType = System.Type.GetType("System.String");
         column.ColumnName = key;
         column.AutoIncrement = false;
         column.Caption = key;
         dataRow.Table.Columns.Add(column);
      }
                    
      dataRow[key] = dict[key];
   }
   counter  ;
   dataTable.Rows.Add(dataRow);
}
dataGridView1.DataSource = dataTable;