Codegolf:使用C#中的最小代码将csv转换为HTML表

时间:2009-06-08 20:38:20

标签: c# csv code-golf

我在我自己的个人工具包lib中添加了一个函数来执行简单的CSV到HTML表转换。

我希望在C#中使用最小的代码来完成此操作,并且它需要能够处理超过~500mb的CSV文件。

到目前为止,我的两个竞争者

  • 将csv拆分为数组 分隔符和构建HTML输出

  • 使用表格搜索替换分隔符 th tr td标签

假设已经处理了文件/读取/磁盘操作...即,我将包含所述CSV内容的字符串传递给此函数。输出将由直接简单的HTML样式标记组成,是的,数据可能有杂散的逗号和中断。

更新:有些人问道。如果有帮助,100%我处理的CSV直接来自excel。

示例字符串:

a1,b1,c1\r\n
a2,b2,c2\r\n

3 个答案:

答案 0 :(得分:6)

将所有行读入内存

    var lines =File.ReadAllLines(args[0]);
    using (var outfs = File.AppendText(args[1]))
    {
        outfs.Write("<html><body><table>");
        foreach (var line in lines)
            outfs.Write("<tr><td>" + string.Join("</td><td>", line.Split(',')) + "</td></tr>");
        outfs.Write("</table></body></html>");
    }

或一次读一行

    using (var inFs = File.OpenText(args[0]))
    using (var outfs = File.AppendText(args[1]))
    {
        outfs.Write("<html><body><table>");
        while (!inFs.EndOfStream )
            outfs.Write("<tr><td>" + string.Join("</td><td>", inFs.ReadLine().Split(',')) + "</td></tr>");
        outfs.Write("</table></body></html>");
    }

... @Jimmy ...我使用LINQ创建了一个扩展版本。这是亮点......(读取行的懒惰eval)

    using (var lp = args[0].Load())
        lp.Select(l => "<tr><td>" + string.Join("</td><td>", l.Split(',')) + "</td></tr>")
        .Write("<html><body><table>", "</table></body></html>", args[1]);

答案 1 :(得分:2)

可能没有比这更短的时间,但请记住,任何真正的解决方案都会处理引号,引号内的逗号和转换为html实体。

return "<table><tr><td>"+s
   .Replace("\n","</td></tr><tr><td>")
   .Replace(",","</td><td>")+"</td></tr></table>";
编辑:这是(很大程度上未经测试)添加htmlencode和引用匹配。我首先是htmlencode,然后所有的逗号变成'&lt;' (它不会发生碰撞,因为现有的已经编码了。

bool q=false;
return "<table><tr><td>"
  + new string(HttpUtility.HtmlEncode(s)
       .Select(c=>c=='"'?(q=!q)?c:c:(c==','&&!q)?'<':c).ToArray())
    .Replace("<", "</td><td>")
    .Replace("\n", "</td></tr><tr><td>")
  + "</td></tr></table>";

答案 2 :(得分:1)

这是一个使用lambda表达式的有趣版本。它不像用"</td><td>"替换逗号那么短,但它有它自己的特殊魅力:

var r = new StringBuilder("<table>");
s.Split('\n').ToList().ForEach(t => r.Append("<tr>").Append(t.Split(',').Select(u => "<td>" + u + "</td>")).Append("</tr>"));
return r.Append("</table>").ToString();

如果我要将其用于生产,我会使用状态机来跟踪嵌套引号,换行符和逗号,因为excel可以在列的中间放置新行。 IIRC你也可以完全指定一个不同的分隔符。