我使用下面的代码将数据从csv文件导出到datatable。 由于值是混合文本,即数字和字母,因此某些列不会导出到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();
}
}
答案 0 :(得分:0)
可能有用的主要是首先停止使用OleDB对象来读取分隔文件。我建议使用'TextFieldParser',这是我已经成功使用了2年以上的客户端。
http://www.dotnetperls.com/textfieldparser
可能还有其他问题,但没有看到您的.CSV文件,我无法告诉您问题所在。
TextFieldParser专门用于解析逗号分隔文件。 OleDb对象不是。所以,从那里开始然后我们可以确定问题可能是什么,如果它仍然存在。
如果您查看我提供的链接上的示例,它们只是在控制台上写行。您可以更改此代码部分,以便像我一样将行添加到DataTable对象,以进行排序。
答案 1 :(得分:0)
对于逗号分隔的文件,这对我有用
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;
}