2013-10-24 166 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"; 
     } 
     }