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

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

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

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

  • 通过分隔符将csv拆分为数组并构建HTML输出

  • 使用表格标记来搜索替换分隔符

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

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

示例字符串:

 A1,B1,C1 \ r \ n
 A2,B2,C2 \ r \ n

将所有行读入内存

var lines =File.ReadAllLines(args[0]); using (var outfs = File.AppendText(args[1])) { outfs.Write(""); foreach (var line in lines) outfs.Write(""); outfs.Write("
" + string.Join("", line.Split(',')) + "
"); }

或一次读一行

  using (var inFs = File.OpenText(args[0])) using (var outfs = File.AppendText(args[1])) { outfs.Write(""); while (!inFs.EndOfStream ) outfs.Write(""); outfs.Write("
" + string.Join("", inFs.ReadLine().Split(',')) + "
"); }

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

  using (var lp = args[0].Load()) lp.Select(l => "" + string.Join("", l.Split(',')) + "") .Write("", "
", args[1]);

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

 return "
"+s .Replace("\n","
") .Replace(",","")+"
";

编辑:这是(很大程度上未经测试)添加htmlencode和引用匹配。 我首先hmmlencode,然后所有逗号变成’<'(它们不会发生碰撞,因为现有的逗号已经被编码了。

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

这是一个使用lambda表达式的有趣版本。 它不像用"

"

替换逗号那么简短,但它有它自己的特殊魅力:

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

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