C# 显示已解析的csv文件
我已经在这方面工作了好几个小时,似乎不知道如何在表格中正确显示数据C# 显示已解析的csv文件,c#,visual-studio,csv,C#,Visual Studio,Csv,我已经在这方面工作了好几个小时,似乎不知道如何在表格中正确显示数据 使用(TextFieldParser csvParser=newtextfieldparser(path)){ csvParser.CommentTokens=新字符串[]{“#”}; SetDelimiters(新字符串[]{“,”}); csvParser.HasFieldsEnclosedInQuotes=true; csvParser.ReadLine(); int pointX=30; int pointY=40; 而
使用(TextFieldParser csvParser=newtextfieldparser(path)){
csvParser.CommentTokens=新字符串[]{“#”};
SetDelimiters(新字符串[]{“,”});
csvParser.HasFieldsEnclosedInQuotes=true;
csvParser.ReadLine();
int pointX=30;
int pointY=40;
而(!csvParser.EndOfData){
string[]fields=csvParser.ReadFields();
int rowNums=fields.Length;
int指数=0;
对于(索引=0;索引
到目前为止,我正在抓取一个存储在路径
变量中的csv文件,并读取该文件。可以通过字段[]
访问输出。这很好,然后我尝试创建文本框,根据行将数据放入其中,但我当前拥有的结果如下所示
我想按顺序正确显示列名和行,这里是一个示例图像,它在记事本中的外观
在记事本中,您将看到每一行都是一行,,指示行中的一个新条目,我想在我的程序中以这种方式显示,但在文本框中
另外请注意,此程序将打开的并非所有csv文件都很短,大多数文件都是数千行或更多行的大文件,因此无法简单地将
字段[0]
硬编码我认为控件重叠,因此您无法看到它们。问题在于它们像椅子一样重叠。您没有重置坐标
这里有一个改进:
using (TextFieldParser csvParser = new TextFieldParser(path)) {
csvParser.CommentTokens = new string[] { "#" };
csvParser.SetDelimiters(new string[] { "," });
csvParser.HasFieldsEnclosedInQuotes = true;
csvParser.ReadLine();
int offsetX = 30;
int offsetY = 40;
int counter;
while (!csvParser.EndOfData) {
int pointerY = ++counter * offsetY; // first counter increments by one, then counter times offsetY occurs
int pointerX;
string[] fields = csvParser.ReadFields();
int rowNums = fields.Length;
for(int index = 0; index < rowNums;index++) {
pointerX = (index + 1) * offsetX;
string name = fields[index];
TextBox n = new TextBox() { Text = name, Location = new Point(pointerX, pointerY) };
panel2.Controls.Add(n);
panel2.Show(); // should be unnecessary
}
}
}
使用(TextFieldParser csvParser=newtextfieldparser(path)){
csvParser.CommentTokens=新字符串[]{“#”};
SetDelimiters(新字符串[]{“,”});
csvParser.HasFieldsEnclosedInQuotes=true;
csvParser.ReadLine();
int offsetX=30;
int offsetY=40;
整数计数器;
而(!csvParser.EndOfData){
int pointerY=++counter*offsetY;//第一个计数器递增1,然后计数器乘以offsetY
int pointerX;
string[]fields=csvParser.ReadFields();
int rowNums=fields.Length;
对于(int index=0;index
最好使用DataGridView以表格格式显示此类数据
从工具箱将DataGridView控件添加到表单中。您需要构建一个绑定到DataGridview的DataTable
下面是您可以使用的内容(我注释掉了您在CSV文件中跳过标题的地方,并使用该行获取要在datagrid中使用的列标题)
var dt=new DataTable();
var-lineNo=0;
使用(var csvParser=newtextfieldparser(path))
{
csvParser.CommentTokens=新字符串[]{“#”};
SetDelimiters(新字符串[]{“,”});
csvParser.HasFieldsEnclosedInQuotes=true;
//csvParser.ReadLine();
而(!csvParser.EndOfData)
{
var fields=csvParser.ReadFields();
var rowNums=fields.Length;
var row=dt.NewRow();
lineNo+=1;
int指数=0;
对于(索引=0;索引 我会考虑切换到GRIDVIEW,因为创建大量的控件会大大降低用户界面,当我们谈论具有数千行或更多的大文件时。看起来更好,但仍然不太正确。你能提供一个使用GridView的例子吗?我编辑了我的代码。请参见“编辑”下的“我已更改的内容”。您必须查找文本框的宽度。你可以创建一个“模板”。此索引属于此宽度的文本框。但是在使用DataGridView时,您不必定位单元格。至少您只需设置列的宽度。请访问此页面。C#DataGridView添加列和行的链接提供了添加列和行的示例编码>到循环的之后。您只希望随着外部(while
)循环的每次迭代增加pointY
。
var dt = new DataTable();
var lineNo = 0;
using (var csvParser = new TextFieldParser(path))
{
csvParser.CommentTokens = new string[] { "#" };
csvParser.SetDelimiters(new string[] { "," });
csvParser.HasFieldsEnclosedInQuotes = true;
//csvParser.ReadLine();
while (!csvParser.EndOfData)
{
var fields = csvParser.ReadFields();
var rowNums = fields.Length;
var row = dt.NewRow();
lineNo += 1;
int index = 0;
for (index = 0; index < rowNums; index++)
{
if (lineNo==1)
{
dt.Columns.Add(fields[index]);
}
else
{
row[index] = fields[index];
}
}
if (lineNo == 1) continue;
dt.Rows.Add(row);
dt.AcceptChanges();
}
}
dataGridView1.DataSource = dt;