我正在尝试从如下所示的.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 |
在以下行中也可见:
如何将第一行作为列标题,其余作为行?
如果可能的话,我不想使用CSVHelper
。
答案 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;