【问题标题】:Can somebody recommend a CSV to Html Table Generator? [closed]有人可以向 HTML 表生成器推荐 CSV 吗? [关闭]
【发布时间】:2012-11-19 05:47:13
【问题描述】:

我需要解析一个非常简单的 csv 文件,它代表 7 列和 3 行。 .Net 中是否有任何内置功能可以执行此操作,还是我应该手动执行?

【问题讨论】:

    标签: c# .net csv html-table


    【解决方案1】:

    使用FileHelpers library 之类的东西来加载文件并将其转换为数据表,然后只需使用转发器以所需的 html 格式发出行。

    【讨论】:

      【解决方案2】:

      怎么样:

      public static DataTable csvToDataTable(string file, bool isRowOneHeader)
      {
      
      DataTable csvDataTable = new DataTable();
      
      //no try/catch - add these in yourselfs or let exception happen
      String[] csvData = File.ReadAllLines(HttpContext.Current.Server.MapPath(file));
      
      //if no data in file ‘manually’ throw an exception
      if (csvData.Length == 0)
      {
          throw new Exception(”CSV File Appears to be Empty”);
      }
      
      String[] headings = csvData[0].Split(',');
      int index = 0; //will be zero or one depending on isRowOneHeader
      
      if(isRowOneHeader) //if first record lists headers
      {
          index = 1; //so we won’t take headings as data
      
          //for each heading
          for(int i = 0; i < headings.Length; i++)
          {
              //replace spaces with underscores for column names
              headings[i] = headings[i].Replace(” “, “_”);
      
             //add a column for each heading
              csvDataTable.Columns.Add(headings[i], typeof(string));
         } 
      }
      else //if no headers just go for col1, col2 etc.
      {
          for (int i = 0; i < headings.Length; i++)
          {
             //create arbitary column names
             csvDataTable.Columns.Add(”col”+(i+1).ToString(), typeof(string));
          }
      }
      
      //populate the DataTable
      for (int i = index; i < csvData.Length; i++)
      {
          //create new rows
          DataRow row = csvDataTable.NewRow();
      
          for (int j = 0; j < headings.Length; j++)
          {
               //fill them
               row[j] = csvData[i].Split(’,')[j];
          }
      
          //add rows to over DataTable
          csvDataTable.Rows.Add(row);
      }
      
      //return the CSV DataTable
      return csvDataTable;
      
      } 
      

      【讨论】:

      • 不考虑带引号的字符串。
      【解决方案3】:

      powershell:

      ps> import-csv foo.csv | convertto-html foo.html
      

      ;-)

      【讨论】:

        【解决方案4】:

        事实证明这是可行的:(嗯,'this' 是一个近似值)

        protected void Page_Load(object sender, EventArgs e)
        {
            List<List<string>> data = GetListFromCsv(this.DataFile);
        
            Table table = GetHtmlTable(data);
        
            this.plcDataTable.Controls.Add(table);
        }
        
        // get list of 'rows' (event though each row is just a list of strings)
        public static List<List<string>> GetListFromCsv(string file)
        {
            String[] csvData = File.ReadAllLines(file);
        
            List<string> rowList = new List<string>();
        
            if (csvData.Length == 0)
            {
                throw new Exception("CSV File Appears to be Empty");
            }
        
            var rows = (from r in csvData
                        select r.Split(',').ToList()
                       ).ToList();
        
            return rows;
        
        }
        
        private Table GetHtmlTable(List<List<string>> dataTable)
        {
            List<TableRow> rows = new List<TableRow>();
        
            rows.AddRange(GetListOfRows(dataTable));
        
            Table table = new Table();
            table.Rows.AddRange(rows.ToArray());
        
            return table;
        }
        
        // convert the 'rows' to real rows.
        public static IEnumerable<TableRow> GetListOfRows(List<List<string>> table)
        {
            var rows = new List<TableRow>();
        
            foreach (var row in table
            {
                rows.Add(GetTableRow(row));
            }
        
            return rows;
        }
        
        private static TableRow GetTableRow(List<string> rows)
        {
            TableRow row = new TableRow();
        
            row.Cells.Add(GetColumnOneCell(rows));
            row.Cells.AddRange(GetValueCells(rows).ToArray());
        
            return row;
        }
        

        【讨论】:

          猜你喜欢
          • 2011-05-26
          • 2010-10-28
          • 1970-01-01
          • 1970-01-01
          • 2012-03-31
          • 1970-01-01
          • 2010-09-24
          • 1970-01-01
          • 2012-01-31
          相关资源
          最近更新 更多