解析C#中的CSV文件时遇到的问题#
我试图将CSV文件导入到我的C#站点并将其保存在数据库中。在做研究时,我了解了CSV解析,我试图实现这一点,但我遇到了一些麻烦。这里是我的代码的一部分至今:解析C#中的CSV文件时遇到的问题#
string fileext = Path.GetExtension(fupcsv.PostedFile.FileName);
if (fileext == ".csv")
{
string csvPath = Server.MapPath("~/CSVFiles/") + Path.GetFileName(fupcsv.PostedFile.FileName);
fupcsv.SaveAs(csvPath);
// Add Columns to Datatable to bind data
DataTable dtCSV = new DataTable();
dtCSV.Columns.AddRange(new DataColumn[2] { new DataColumn("ModuleId", typeof(int)), new DataColumn("CourseId", typeof(int))});
// Read all the lines of the text file and close it.
string[] csvData = File.ReadAllLines(csvPath);
// iterate over each row and Split it to New line.
foreach (string row in csvData)
{
// Check for is null or empty row record
if (!string.IsNullOrEmpty(row))
{
using (TextFieldParser parser = new TextFieldParser(csvPath))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
//Process row
string[] fields = parser.ReadFields();
int i = 1;
foreach (char cell in row)
{
dtCSV.NewRow()[i] = cell;
i++;
}
}
}
}
}
}
我不断收到错误“没有排在位置1”在“dtCSV.Rows [dtCSV.Rows.Count - 1] [i] =细胞;” 任何帮助将不胜感激,谢谢
你正在尝试索引你还没有创建的行。取而代之的
dtCSV.Rows[dtCSV.Rows.Count - 1][i] = cell;
使用
dtCSV.NewRow()[i] = cell;
我也建议你从0
,而不是从1
开始索引i
。
好吧,结果证明你的代码有一堆错误,所以我做了一些编辑。
string fileext = Path.GetExtension(fupcsv.PostedFile.FileName);
if (fileext == ".csv")
{
string csvPath = Server.MapPath("~/CSVFiles/") + Path.GetFileName(fupcsv.PostedFile.FileName);
fupcsv.SaveAs(csvPath);
DataTable dtCSV = new DataTable();
dtCSV.Columns.AddRange(new DataColumn[2] { new DataColumn("ModuleId", typeof(int)), new DataColumn("CourseId", typeof(int))});
var csvData = File.ReadAllLines(csvPath);
bool headersSkipped = false;
foreach (string line in csvData)
{
if (!headersSkipped)
{
headersSkipped = true;
continue;
}
// Check for is null or empty row record
if (!string.IsNullOrEmpty(line))
{
//Process row
int i = 0;
var row = dtCSV.NewRow();
foreach (var cell in line.Split(','))
{
row[i] = Int32.Parse(cell);
i++;
}
dtCSV.Rows.Add(row);
dtCSV.AcceptChanges();
}
}
}
我抛弃使用TextFieldParser解决方案,纯粹是因为我不熟悉它,但如果你想坚持下去,它不应该是很难重新融入它。
下面是一些你有错的事情:
- 不调用
NewRow()
创建一个新的行或在row
它与AddRow(row)
- 迭代添加到表通过人物而不是
fields
你解析 - 没有解析的
cell
的价值 - 它的值类型是string
和您要添加到int
列
一些其他的事情值得一提的(只是为了提高代码的性能和可读性:))
- 考虑宣布新的变量在使用
var
,它需要大量的应力远离不必担心什么正在创建的变量类型 - 正如其他人在评论中所说,使用
ReadAllLines()
它可以将文本文件整齐地分析成行,从而更易于迭代。 - 使用数组或列表工作时,很多时候,你需要指数从0,而不是从1
- 你必须使用的AcceptChanges()来提交您所做
我做到了,但现在我得到此错误:“在System.Data.dll中发生类型'System.IndexOutOfRangeException'的异常,但未在用户代码中处理 其他信息:找不到列2.“谢谢 –
我更新了我的答案,看看! –
那么,它工作? –
将是所有变化如果可以发布整个例外,并且如果可能的话,链接到您尝试使用代码的csv文件时,效果会更好。 –
将该行添加到数据表中,然后将值分配给它的行。 –
该例外的第一部分是“在System.Data.dll中发生类型'System.IndexOutOfRangeException'的异常,但未在用户代码中处理”。不知道如何放csv文件,但它只有两行关闭数字 –