使用第一行的列标题将.txt文件内容读取到DataTable

时间:2018-11-02 18:01:48

标签: c# winforms datagridview datatable

我正在尝试从如下所示的.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 | GHI |

在以下行中也可见:

enter image description here

如何将第一行作为列标题,其余作为行?

如果可能的话,我不想使用CSVHelper

5 个答案:

答案 0 :(得分:1)

创建标头后的第一行时只需跳过

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

答案 1 :(得分:1)

当前代码的问题是,当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);
                    }

它应该可以正常工作。如果仅在创建了列标题的情况下仅创建一行,则说明您仅在第一遍对第一行执行任何操作,然后将其转储。

答案 2 :(得分:0)

我认为您想添加列或添加行。

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);
}

答案 3 :(得分:0)

这可以工作

import pandas as pd
import numpy as np
from scipy.optimize import fsolve

Aq = .6
Av = .6

def eqs(p):
    a, b = p    
    return(np.dot(x*(qS**a*vS**b)/np.dot(x,qS**a*vS**b),qZ)-Aq 
            , np.dot(x*(qS**a*vS**b)/np.dot(x,qS**a*vS**b),vZ)-Av)

sol = fsolve(eqs, (1,1), full_output=True)
x, y = sol[0]

答案 4 :(得分:0)

另一种方法,更面向LINQ

  
      
  • 使用File.ReadAllLines将所有文件行解析为字符串数组。
  •   
  • 创建一个包含所有数据行的List<string[]>
    列值使用字符串splitting组成字符串行   提供了Delimiter
  •   
  • 第一个Row值用于构建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;