Чтение содержимого файла .txt в DataTable с заголовками столбцов в первой строке - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь загрузить данные из файла .txt, который выглядит следующим образом:

|ABC|DEF|GHI|
|111|222|333|
|444|555|666|

С кодом:

using (StringReader reader = new StringReader(new StreamReader(fileStream, Encoding.Default).ReadToEnd()))
{
    string line;
    //reader.ReadLine(); //skip first line
    while (reader.Peek() != -1)
    {
        line = reader.ReadLine();
        if (line == null || line.Length == 0)
            continue;

        string[] values = line.Split('|').Skip(1).ToArray();

        if (!isColumnCreated)
        {
            for (int i = 0; i < values.Count(); i++)
            {
                table.Columns.Add(values[i]);
            }
            isColumnCreated = true;
        }

        DataRow row = table.NewRow();

        for (int i = 0; i < values.Count(); i++)
        {
            row[i] = values[i];
        }
        table.Rows.Add(row);
        products++;
    }
}

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

| ABC | DEF | ГХИ |

виден также в строках:

enter image description here

Как поместить первую строку как заголовки столбцов, а остальные как строки?

Я не хочу использовать CSVHelper для этого, если это возможно.

Ответы [ 5 ]

0 голосов
/ 02 ноября 2018

Другой метод, более ориентированный на LINQ.

  • Используйте File.ReadAllLines для разбора всех строк файла в массив строк.
  • Создание List<string[]>, содержащего все строки данных.
    Значения столбцов состоят разбиение строки строки с использованием при условии Delimiter.
  • Первые значения строк используются для построения DataTable Columns элементов.
  • Первая строка удаляется из списка.
  • Все остальные строки добавляются в коллекцию DataTable.Rows.
  • Установите DataGridView.DataSource на новый DataTable.


char Delimiter = '|';
string[] Lines = File.ReadAllLines("[SomeFilePath]", Encoding.Default);
List<string[]> FileRows = Lines.Select(line => 
    line.Split(new[] { Delimiter }, StringSplitOptions.RemoveEmptyEntries)).ToList();

DataTable dt = new DataTable();
dt.Columns.AddRange(FileRows[0].Select(col => new DataColumn() { ColumnName = col }).ToArray());

FileRows.RemoveAt(0);
FileRows.ForEach(row => dt.Rows.Add(row));

dataGridView1.DataSource = dt;
0 голосов
/ 02 ноября 2018

Проблема с вашим текущим кодом заключается в том, что вы обрабатываете, когда isColumnCreated имеет значение false, но не соответствует true. Если вы измените это:

                    if (!isColumnCreated)
                    {

                        for (int i = 0; i < values.Count(); i++)
                        {
                            table.Columns.Add(values[i]);
                        }
                        isColumnCreated = true;
                    }

                    DataRow row = table.NewRow();

                    for (int i = 0; i < values.Count(); i++)
                    {
                        row[i] = values[i];

                    }
                    table.Rows.Add(row);
                    products++;

к этому

                    if (!isColumnCreated)
                    {

                        for (int i = 0; i < values.Count(); i++)
                        {
                            table.Columns.Add(values[i]);
                        }
                        isColumnCreated = true;
                    }

                    DataRow row = table.NewRow();
                    else if (isColumnCreated)
                    {
                         for (int i = 0; i < values.Count(); i++)
                         {
                               row[i] = values[i];

                         }
                         table.Rows.Add(row);
                    }

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

0 голосов
/ 02 ноября 2018

Просто нужно пропустить, когда первая строка после заголовка создана

string line;
bool bheader= false;
                    //reader.ReadLine(); //skip first line
                    while (reader.Peek() != -1)
                    {

                        line = reader.ReadLine();
                        if (line == null || line.Length == 0)
                            continue;

                        string[] values = line.Split('|').Skip(1).ToArray();


                        if (!isColumnCreated)
                        {

                            for (int i = 0; i < values.Count(); i++)
                            {
                                table.Columns.Add(values[i]);
                            }
                            isColumnCreated = true;
                            bheader = true;
                        }
if(bheader ==false){
                        DataRow row = table.NewRow();

                        for (int i = 0; i < values.Count(); i++)
                        {
                            row[i] = values[i];

                        }
                        table.Rows.Add(row);
                        products++;
                    }
                    }
                    bheader = false;
                }
0 голосов
/ 02 ноября 2018

Это будет работать

        DataTable dt = new DataTable();
        using (System.IO.StreamReader sr = new System.IO.StreamReader("PathToFile"))
        {
            string currentline = string.Empty;
            bool doneHeader = false;
            while ((currentline = sr.ReadLine()) != null)
            {
                if (!doneHeader)
                {
                    foreach (string item in currentline.Split('YourDelimiter'))
                    {
                        dt.Columns.Add(item);
                    }
                    doneHeader = true;
                    continue;
                }
                dt.Rows.Add();
                int colCount = 0;
                foreach (string item in currentline.Split('YourDelimiter'))
                {
                    dt.Rows[dt.Rows.Count - 1][colCount] = item;
                    colCount++;
                }
            }
        }
0 голосов
/ 02 ноября 2018

Я думаю, вы хотите добавить столбцы или добавить строку.

if (!isColumnCreated)
{

  for (int i = 0; i < values.Count(); i++)
  {
   table.Columns.Add(values[i]);
   }
   isColumnCreated = true;
   }
 }
else
{
  DataRow row = table.NewRow();

  for (int i = 0; i < values.Count(); i++)
  {
  row[i] = values[i];

  }
  table.Rows.Add(row);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...