2017-04-06 62 views
0

我试图将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] =细胞;” 任何帮助将不胜感激,谢谢

+0

将是所有变化如果可以发布整个例外,并且如果可能的话,链接到您尝试使用代码的csv文件时,效果会更好。 –

+0

将该行添加到数据表中,然后将值分配给它的行。 –

+0

该例外的第一部分是“在System.Data.dll中发生类型'System.IndexOutOfRangeException'的异常,但未在用户代码中处理”。不知道如何放csv文件,但它只有两行关闭数字 –

回答

3

你正在尝试索引你还没有创建的行。取而代之的

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()来提交您所做
+0

我做到了,但现在我得到此错误:“在System.Data.dll中发生类型'System.IndexOutOfRangeException'的异常,但未在用户代码中处理 其他信息:找不到列2.“谢谢 –

+0

我更新了我的答案,看看! –

+0

那么,它工作? –