我在我自己的个人工具包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
答案 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你也可以完全指定一个不同的分隔符。