2013-10-24 77 views
0

我使用此代碼解析值並將它們存儲在列表中。第一行具有正確存儲的名稱。但是,當存儲值時,只有第二行被保存。我不確定我需要做什麼編輯,以便它解析所有其他行。解析CSV值的腳本

請參閱下面的圖像和代碼。

enter image description here

List<string> names = new List<string>();     // List to store Key names 
List<string> values = new List<string>();     // List to store key values 

using (StreamReader stream = new StreamReader(filePath)) 
{ 
    names = stream.ReadLine().Split(',').ToList();   // Seperate key names and store them in a List 
    values = stream.ReadLine().Split(',').ToList();  // Seperate key values and store them in a list 
} 
+2

到目前爲止,您的代碼沒有你的描述到底是什麼 - 請編輯你的問題所以很清楚你期望和不起作用。 'values'變量的類型和缺少任何迭代都清楚地表明代碼應該只讀取CSV中的一行數據。 –

+4

備註:請考慮使用現有的CSV解析器...您的代碼處理轉義引號完全錯誤... –

+0

它沒有做的是它沒有存儲從第3行開始的值。它只存儲第2行。 – wackytacky99

回答

3

看看是否有這樣的效果更好:

// List to store Key names 
    List<string> names = new List<string>();             
    // List to store key values 
    List<List<string>> values = new List<string>();            

    using (StreamReader stream = new StreamReader(filePath)) 
    { 
     if(!stream.EndOfStream) 
     { 
      // Seperate key names and store them in a List 
      names = stream.ReadLine().Split(',').ToList(); 
     }      
     while(!stream.EndOfStream) 
     { 
      // Seperate key values and store them in a list 
      values.Add(stream.ReadLine().Split(',').ToList());     
     } 
    } 

這會改變你的價值觀清單是字符串列表的列表中,這樣的每一行都將字符串列表

儘管這可能不是解析.csv的最佳方法,但如果您的數據一致且文件格式非常一致,那麼您可能會逃避這樣做。只要您嘗試使用奇數值,帶引號的字符串,帶逗號的字符串等,就需要採用不同的方法。

0

我已經寫了網格視圖代碼更改到一個list.I認爲這將有助於

protected void Button1_Click(object sender, EventArgs e) 
    { 
     if (FileUpload1.HasFile) 
     { 
      string s = FileUpload1.FileName.Trim(); 
      if (s.EndsWith(".csv")) 
      { 
       FileUpload1.PostedFile.SaveAs(Server.MapPath("~/data/" + s)); 
       string[] readText = File.ReadAllLines(Server.MapPath("~/data/" + s)); 
       DataSet ds = new DataSet(); 
       DataTable dt = new DataTable(); 
       // Array.Sort(readText); 

       for (int i = 0; i < readText.Length; i++) 
       { 
        if (i == 0) 
        { 
         string str = readText[0]; 
         string[] header = str.Split(','); 

         dt.TableName = "sal"; 
         foreach (string k in header) 
         { 
          dt.Columns.Add(k); 
         } 
        } 
        else 
        { 
         DataRow dr = dt.NewRow(); 

         string str1 = readText[i]; 
         if (readText[i] == ",,,,") 
         { 
          break; 
         } 


         string[] rows = str1.Split(','); 
         if (dt.Columns.Count == rows.Length) 
         { 

          for (int z = 0; z < rows.Length; z++) 
          { 
           if (rows[z] == "") 
           { 
            rows[z] = null; 

           } 

           dr[z] = rows[z]; 
          } 
          dt.Rows.Add(dr); 


         } 
         else 
         { 
          Label1.Text = "please select valid format"; 
         } 
        } 


       } 

       //Iterate through the columns of the datatable to set the data bound field dynamically. 
       ds.Merge(dt); 
       Session["tasktable"] = dt; 
       foreach (DataColumn col in dt.Columns) 
       { 
        BoundField bf = new BoundField(); 

        bf.DataField = col.ToString(); 
        bf.HeaderText = col.ColumnName; 
        if (col.ToString() == "Task") 
        { 
         bf.SortExpression = col.ToString(); 
        } 
        GridView1.Columns.Add(bf); 

       } 
       GridView1.DataSource = ds; 
       GridView1.DataBind(); 


      } 
      else 
      { 
       Label1.Text = "please select a only csv format"; 
      } 

     } 
     else 
     { 
      Label1.Text = "please select a file"; 
     } 
     }