【发布时间】:2017-09-19 10:22:45
【问题描述】:
我正在尝试开发一种工具,该工具将获取 CSV 文件并将其导入数据表,其中数据表中的第一列是行计数器。
CSV 文件来自不同的客户,因此具有不同的结构。有些有标题行;有些有几个标题行;有些没有标题行。它们也有不同的列。
到目前为止,我有下面的代码。
public void Import_CSV()
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "CSV Files (*.csv)|*.csv";
bool? result = dialog.ShowDialog();
if (result ?? false)
{
string[] headers;
string CSVFilePathName = dialog.FileName;
string delimSelect = cboDelimiter.Items.GetItemAt(cboDelimiter.SelectedIndex).ToString();
// If user hasn't selected a delimiter, assume comma
if (delimSelect == "")
{
delimSelect = ",";
}
string[] delimiterType = new string[] {cboDelimiter.Items.GetItemAt(cboDelimiter.SelectedIndex).ToString()};
DataTable dt = new DataTable();
// Read first line of file to get number of fields and create columns and column numbers in data table
using (StreamReader sr1 = new StreamReader(CSVFilePathName))
{
headers = sr1.ReadLine().Split(delimiterType, StringSplitOptions.None);
//dt.Columns.Add("ROW", typeof(int));
//dt.Columns["ROW"].AutoIncrement = true;
//dt.Columns["ROW"].AutoIncrementSeed = 1;
//dt.Columns["ROW"].AutoIncrementStep = 1;
int colCount = 1;
foreach (string header in headers)
{
dt.Columns.Add("C" + colCount.ToString());
colCount++;
}
}
using (StreamReader sr = new StreamReader(CSVFilePathName))
{
while (!sr.EndOfStream)
{
string[] rows = sr.ReadLine().Split(delimiterType, StringSplitOptions.None);
DataRow dr = dt.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dr[i] = rows[i];
}
dt.Rows.Add(dr);
}
}
dtGrid.ItemsSource = dt.DefaultView;
txtColCount.Text = dtGrid.Columns.Count.ToString();
txtRowCount.Text = dtGrid.Items.Count.ToString();
}
}
这很有效,因为它会创建列标题(C1、C2 ......根据 csv 文件中有多少)然后写入行,但我想在添加行时,最左侧带有行号。在代码中,您可以看到我已经注释掉了一个创建自动编号列的部分,但我完全不知道如何将行写入数据表。如果我取消注释该部分,我会收到错误,因为 csv 文件中的第一列尝试写入 int 字段。我知道您可以指定每行中的哪个字段可以进入哪一列,但这在这里无济于事,因为此时这些列是未知的。我只需要它能够读取任何文件,无论结构如何,但使用行计数器。
希望这是有道理的。
【问题讨论】:
标签: c# csv datatable streamreader