2017-04-06 61 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

那麼,它工作? –