Текст с разделителями в DataTable - PullRequest
0 голосов
/ 18 октября 2018

У меня есть файл с разделителями табуляции, который я хочу загрузить в DataGridView (DGV);для этого я использую следующий код:

DataTable dt = new DataTable();
using (FileStream stream = File.OpenRead("logs.txt"))
{
    using (StreamReader reader = new StreamReader(stream))
    {
        string line = reader.ReadLine();

        while (line != null)
        {
            string[] items = line.Split('\t');
            line = reader.ReadLine();

            if (dt.Columns.Count == 0)
            {
                for (int i = 0; i < items.Length; i++)
                {
                    dt.Columns.Add("Column " + i);
                }
            }
            dt.Rows.Add(items);
        }
        dataGridView1.DataSource = dt;
    }
}

Проблема в том, что количество столбцов в строке не всегда одинаково, и это приводит к ошибке " Входной массив длиннее, чемстолбцы в этой таблице".

Текстовый пример:

x   xx  xxx xxxx    xxxxx
x   xx  xxx xxxx    xxxxx   xxxxxx  xxxxxxx
x   xx  xxx xxxx    xxxxx   xxxxxx  xxxxxxx xxxxxxxx    xxxxxxxxx

Учитывая проблему, как я могу передать все текстовый файл в DGV?

1 Ответ

0 голосов
/ 18 октября 2018

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

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

В любом случае, возвращаясь к вашему коду.

Вы добавляете новые столбцы в таблицу только тогда, когда dt.Columns.Count равен нулю.Таким образом, столбцы будут добавлены только для первой строки файла, поскольку в данный момент столбцы отсутствуют.И значения первой строки из файла будут успешно добавлены в таблицу.

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

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

А также вместо использования dt.Rows.Add добавьте значения в строку по одному.

Рассмотрите следующий код.

DataTable dt = new DataTable();
using (FileStream stream = File.OpenRead("logs.txt"))
{
    using (StreamReader reader = new StreamReader(stream))
    {
        string line = reader.ReadLine();

        while (line != null)
        {
            string[] items = line.Split(',');

            // Check if the number of items in the line is 
            // greater than the current number of columns in the datatable.
            if(items.Length > dt.Columns.Count)
            {
                // Add new columns to the datatable.
                for (int i = dt.Columns.Count; i < items.Length; i++)
                {
                    dt.Columns.Add("Column " + i);
                }
            }

            // Create new row
            var newRow = dt.NewRow();

            // Loop thru the items and add them to the row one by one.
            for (var j = 0; j < items.Length; j++)
            {
                newRow[j] = items[j];
            }

            //Add row to the datatable.
            dt.Rows.Add(newRow);
            line = reader.ReadLine();
        }
        // Bind datatable to the gridview.
        dataGridView1.DataSource = dt;
    }
}

Это должно помочь вам решить вашивыпуск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...