#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;