C# Codegolf:用C语言中最少的代码将csv转换为HTML表格#

C# Codegolf:用C语言中最少的代码将csv转换为HTML表格#,c#,csv,code-golf,C#,Csv,Code Golf,我正在向我自己的个人工具包库中添加一个函数,以进行简单的CSV到HTML表转换 我希望使用尽可能小的代码段在C#中执行此操作,并且它需要能够处理超过~500mb的CSV文件 到目前为止,我的两个竞争者是 通过将csv拆分为数组 分隔符和生成HTML输出 搜索用表替换分隔符 th tr td标签 假设文件/读取/磁盘操作已处理。。。i、 例如,我正在将包含所述CSV内容的字符串传递到此函数中。输出将由简单的HTML风格的自由标记组成,是的,数据中可能有逗号和分隔符 更新:一些人问。如果有帮

我正在向我自己的个人工具包库中添加一个函数,以进行简单的CSV到HTML表转换

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

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

  • 通过将csv拆分为数组 分隔符和生成HTML输出

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

假设文件/读取/磁盘操作已处理。。。i、 例如,我正在将包含所述CSV内容的字符串传递到此函数中。输出将由简单的HTML风格的自由标记组成,是的,数据中可能有逗号和分隔符

更新:一些人问。如果有帮助的话,我处理的CSV 100%直接来自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("<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>");
    }
var lines=File.ReadAllLines(args[0]);
使用(var outps=File.AppendText(args[1]))
{
输出。写(“”);
foreach(行中的var行)
outps.Write(“+string.Join(”,line.Split(“,”)+”);
输出。写(“”);
}
或者一次读一行

    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>");
    }
使用(var inFs=File.OpenText(args[0]))
使用(var outps=File.AppendText(args[1]))
{
输出。写(“”);
而(!inFs.EndOfStream)
outps.Write(“+string.Join(”,inFs.ReadLine().Split(“,”)+”);
输出。写(“”);
}
@吉米。。。我使用LINQ创建了一个扩展版本。这里是亮点。。。(行读取的延迟评估)

使用(var lp=args[0].Load())
lp.Select(l=>“”+string.Join(“,l.Split(','))+“”)
.Write(“,”,args[1]);

可能不会比这短多少,但请记住,任何真正的解决方案都会处理引号、引号内的逗号以及到html实体的转换

return "<table><tr><td>"+s
   .Replace("\n","</td></tr><tr><td>")
   .Replace(",","</td><td>")+"</td></tr></table>";
返回“+s”
.Replace(“\n”和“”)
.替换(“,”,“)+”;

编辑:这里(大部分未经测试)添加了htmlencode和报价匹配。我先编写htmlencode,然后所有的逗号都变成“c==”?(q=!q)?c:c:(c==”,“&&&!q)?”这是一个使用lambda表达式的有趣版本。它不像用
替换逗号那样短。
,但它有自己的独特魅力:

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();
var r=newstringbuilder(“”);
s、 Split('\n').ToList().ForEach(t=>r.Append(“”).Append(t.Split(“,”).Select(u=>”+u+).Append(“”);
返回r.Append(“”).ToString();

如果我要把它用于生产,我将使用状态机来跟踪嵌套的引号、换行符和逗号,因为Excel可以在列的中间放置新的行。Irc还可以完全指定一个不同的定界符。< /P>我们可以对CSV做些什么假设——在列中如何处理逗号或行断线。quotes,您如何转义引号?我知道正确的方法,但这并不意味着它将与csv的外观相匹配。您能否提供一个示例csv字符串和行分隔符?(我假设它是“\r\n”)数据是否保证为矩形?也就是说,每行中的项目数是否相同?但为什么“可能最小的代码段”“这是要求最低的质量。我对CodeGolf的主要反对意见。@Nosredna:我明白所有这些,但这个问题由于想将其添加到工具箱中而使问题变得有点混乱。至少度量应该计算代币,这样缩短名称就不会增加分数。由于提到的内存需求,您的第二个解决方案是迄今为止最好的。如果解决方案确实需要处理500MB大小的文件,那么将整个内容存储在内存中并不是一个好主意。是的,为了简单起见,我编写了第一个版本,然后看到了新的要求,所以我想我应该扩展它。功能齐全,干净,但仍然很短。我想我可以在soem LINQ中填充内容,但它仍然会尝试在内存中加载这些内容。如果将Readlines()封装在一个函数中,该函数返回每一行,则可以获得LINQ的IEnumerable。链接.Replace(),很好-我本来想这样做,但不知道如何处理开始行和结束行-现在很明显,lolwell,代码高尔夫答案越短,就越不有用,所以你不应该删除你的答案;)

return "<table><tr><td>"+s
   .Replace("\n","</td></tr><tr><td>")
   .Replace(",","</td><td>")+"</td></tr></table>";
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>";
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();