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("" + string.Join(" ", line.Split(',')) + " "); outfs.Write("
"); }
或一次读一行
using (var inFs = File.OpenText(args[0])) using (var outfs = File.AppendText(args[1])) { outfs.Write(""); while (!inFs.EndOfStream ) outfs.Write("" + string.Join(" ", inFs.ReadLine().Split(',')) + " "); outfs.Write("
"); }
… @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 => "" + u + " ")).Append(" ")); return r.Append("
").ToString();
如果我要将其用于生产,我将使用状态机来跟踪嵌套引号,换行符和逗号,因为excel可以在列的中间放置新行。 IIRC你也可以完全指定一个不同的分隔符。