将数据从CSV导出到c#中的数据表
本文关键字:数据表 数据 CSV | 更新日期: 2023-09-27 18:04:56
我使用下面的代码从csv文件导出数据表。由于值是混合文本,即数字和字母,一些列不能导出到Datatable。
我在这里做了一些研究,发现我们需要在注册表中设置ImportMixedType = Text
和TypeGuessRows = 0
,这甚至没有解决问题。下面的代码可以在一些混合文本的文件中工作。
有人能告诉我下面的代码有什么问题吗?我错过了什么吗?
if (isFirstRowHeader)
{
header = "Yes";
}
using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
";Extended Properties='"text;HDR=" + header + ";FMT=Delimited'";"))
{
using (OleDbCommand command = new OleDbCommand(sql, connection))
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
adapter.Fill(table);
}
connection.Close();
}
}
对于逗号分隔的文件
public DataTable CSVtoDataTable(string inputpath)
{
DataTable csvdt = new DataTable();
string Fulltext;
if (File.Exists(inputpath))
{
using (StreamReader sr = new StreamReader(inputpath))
{
while (!sr.EndOfStream)
{
Fulltext = sr.ReadToEnd().ToString();//read full content
string[] rows = Fulltext.Split(''n');//split file content to get the rows
for (int i = 0; i < rows.Count() - 1; i++)
{
var regex = new Regex("'''"(.*?)'''"");
var output = regex.Replace(rows[i], m => m.Value.Replace(",", "''c"));//replace commas inside quotes
string[] rowValues = output.Split(',');//split rows with comma',' to get the column values
{
if (i == 0)
{
for (int j = 0; j < rowValues.Count(); j++)
{
csvdt.Columns.Add(rowValues[j].Replace("''c",","));//headers
}
}
else
{
try
{
DataRow dr = csvdt.NewRow();
for (int k = 0; k < rowValues.Count(); k++)
{
if (k >= dr.Table.Columns.Count)// more columns may exist
{ csvdt .Columns.Add("clmn" + k);
dr = csvdt .NewRow();
}
dr[k] = rowValues[k].Replace("''c", ",");
}
csvdt.Rows.Add(dr);//add other rows
}
catch
{
Console.WriteLine("error");
}
}
}
}
}
}
}
return csvdt;
}
可能有帮助的主要事情是首先停止使用OleDB对象读取分隔文件。我建议使用"TextFieldParser",这是我已经为客户成功使用了2年多的东西。
http://www.dotnetperls.com/textfieldparser可能有其他问题,但没有看到你的。csv文件,我不能告诉你你的问题可能在哪里。
TextFieldParser是专门设计用来解析逗号分隔的文件的。OleDb对象则不是。所以,从那里开始,然后我们可以确定问题可能是什么,如果它持续存在。
如果您查看我提供的链接中的示例,它们只是向控制台写入行。您可以修改此代码部分,将行添加到DataTable对象中,就像我所做的那样,以便进行排序。