sudhakarthikeyan Ответов: 2

Ошибка при разделении с помощью C#


В таблице записывается следующее
FarmerQuestions (Table Colunm name)

"Área de Feijão":"1",Melhor Resistente à Seca" "Com Maior;Que vai fazer":"Aument área"

Из вышесказанного я хочу получить следующий результат
Área de Feijão   Melhor Resistente à Seca       Com Maior;Que vai fazer
        1                 Null                              Aumnet área

Csharp код следующим образом для разделения, чтобы получить выше вывода
var othercols = dtFarmerReports.AsEnumerable().SelectMany(x =>
x.Field<string>("farm_detailsdata").Split(new string[] { ":", "," },
 
StringSplitOptions.RemoveEmptyEntries).Where((y, i) => i % 2 == 0)).Distinct().Select(x => new DataColumn(x, typeof(string))).ToList();

    foreach (DataColumn oc in othercols)
    dtFarmerReports.Columns.Add(oc);

 foreach (DataRow dr in dtFarmerReports.Rows)
               {
                    foreach (DataColumn oc in othercols)
                    dr.SetField(oc, dr.Field<string>("farm_detailsdata").Split(',')
.Where(y => y.Contains(oc.ColumnName)).Select(z => z.Split(':')[1]).FirstOrDefault());
              }

        dtFarmerReports.Columns.Remove(dtFarmerReports.Columns["farm_detailsdata"]);

 for (int r = 0; r < dtFarmerReports.Rows.Count; r++)
        {
              DataRow dr = dtFarmerReports.Rows[r];
           for (int c = 0; c < dr.Table.Columns.Count; c++)
               worksheet.Cells[r + 2, c + 1].Value = dr[c];
        }


Когда я запускаю приведенный выше код показывает ошибку следующим образом в приведенной ниже строке
dr.SetField(oc, dr.Field<string>("farm_detailsdata").Split(',')

Ошибка показывает, что индекс находился за пределами границы массива

Строка, которую я разделил, не содержит символа ':' во втором значении

Melhor Resistente à Seca" так что это показывает нижеприведенную ошибку

Индекс находился вне границы массива

Ниже приведен код следующим образом
var othercols = dtFarmerReports.AsEnumerable().SelectMany(x => x.Field<string>("farm_detailsdata").Split(new string[] { ":", "," },

здесь в приведенном выше коде я проверяю split с двоеточием и запятой, предположим, что в значении colon not there отображается ошибка

как исправить эту ошибку какие изменения я должен внести в свой приведенный выше код разделения

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

В таблице записывается следующее
FarmerQuestions (Table Colunm name)

"Área de Feijão":"1",Melhor Resistente à Seca" "Com Maior;Que vai fazer":"Aument área"


Из вышесказанного я хочу получить следующий результат

Área de Feijão   Melhor Resistente à Seca       Com Maior;Que vai fazer
        1                 Null                              Aumnet área

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

var othercols = dtFarmerReports.AsEnumerable().SelectMany(x => x.Field<string>("farm_detailsdata").Split(new string[] { ":", "," },
 
StringSplitOptions.RemoveEmptyEntries).Where((y, i) => i % 2 == 0)).Distinct().Select(x => new DataColumn(x, typeof(string))).ToList();

    foreach (DataColumn oc in othercols)
    dtFarmerReports.Columns.Add(oc);

 foreach (DataRow dr in dtFarmerReports.Rows)
               {
                    foreach (DataColumn oc in othercols)
                    dr.SetField(oc, dr.Field<string>("farm_detailsdata").Split(',')
.Where(y => y.Contains(oc.ColumnName)).Select(z => z.Split(':')[1]).FirstOrDefault());
              }

        dtFarmerReports.Columns.Remove(dtFarmerReports.Columns["farm_detailsdata"]);

 for (int r = 0; r < dtFarmerReports.Rows.Count; r++)
        {
              DataRow dr = dtFarmerReports.Rows[r];
           for (int c = 0; c < dr.Table.Columns.Count; c++)
               worksheet.Cells[r + 2, c + 1].Value = dr[c];
        }


Когда я запускаю приведенный выше код показывает ошибку следующим образом в приведенной ниже строке

dr.SetField(oc, dr.Field<string>("farm_detailsdata").Split(',')


Ошибка показывает, что индекс находился за пределами границы массива

Строка, которую я разделил, не содержит символа ':' во втором значении

Melhor Resistente à Seca" так что это показывает нижеприведенную ошибку

Индекс находился вне границы массива

Ниже приведен код следующим образом

var othercols = dtFarmerReports.AsEnumerable().SelectMany(x => x.Field<string>("farm_detailsdata").Split(new string[] { ":", "," },

здесь в приведенном выше коде я проверяю split с двоеточием и запятой, предположим, что в значении colon not there отображается ошибка

как исправить эту ошибку какие изменения я должен внести в свой приведенный выше код разделения

Maciej Los

Опять репост?

2 Ответов

Рейтинг:
2

Maciej Los

Предполагая, что FarmerQuestions должны быть разделены двоеточием и запятой, где:
- запятая [,] используется для разбиения части столбца на столбцы
и
- двоеточие [:] используется для раздела имени столбца и его значения...
Затем...

Ниже строка не будет возвращать 3 части, потому что между ними нет разделителей (см. подчеркнутую часть)

"Área de Feijão":"1",Melhor Resistente à Seca" "Com Maior;Que vai fazer":"Aument área"



Я проверил это таким образом:
string s = @"""Área de Feijão"":""1"",Melhor Resistente à Seca"" ""Com Maior;Que vai fazer"":""Aument área""";

var result = s.Split(new string[] { ":", "," }, StringSplitOptions.RemoveEmptyEntries)
		.Where((y, i) => i % 2 == 0)
		.Distinct()
		.Select(x => new DataColumn(x.Replace(@"""", ""), typeof(string))).ToList();


и это производит 2 колонки:
Área de Feijão
Melhor Resistente à Seca Com Maior;Que vai fazer


Таким образом, вам, вероятно, нужно справиться с такой ситуацией и проверить, когда нет разделителя между именем столбца и значением (null). Это ваша работа! Так что не ленитесь, прекратите репостить и начните учиться, как использовать отладчик[^].

Кстати: использование точки с запятой [;] внутри имени столбца-плохая идея (даже если это разрешено).

Я уже писал это раньше и должен пожинать плоды: это пахнет плохим дизайном базы данных! Каждый вопрос должен храниться как отдельная запись. Хранение вопросов таким образом обеспечивает такие неприятности.


Рейтинг:
0

Wendelius

В строке ниже

dr.SetField(oc, dr.Field<string>("farm_detailsdata").Split(',')
.Where(y => y.Contains(oc.ColumnName)).Select(z => z.Split(':')[1]).FirstOrDefault());

Вы пытаетесь использовать второй индекс ([1]) из операции разделения, и если данные не содержат точки с запятой, то возникает ошибка
Вы можете попробовать что-то вроде (в зависимости от результата, который вы хотите получить)
dr.SetField(oc, dr.Field<string>("farm_detailsdata").Split(',')
.Where(y => y.Contains(oc.ColumnName)).Select(z => z.Contains(":") ? z.Split(':')[1] : z).FirstOrDefault());


Maciej Los

Мика, ОП крайне ленив и его(ее) ждут готовые к использованию решения!
Пожалуйста, смотрите мой ответ.
Кстати: 5!