0

自分の個人用ツールキットライブラリに関数を追加して、単純なCSVからHTMLテーブルへの変換を実行しています。

可能な限り最小のコードでC#でこれを実行したいのですが、500MBを超えるCSVファイルを処理できる必要があります。

これまでのところ、私の2人の候補者は

  • 区切り文字でcsvを配列に分割し、HTML出力を作成する

  • 検索-区切り文字をテーブルthtrtdタグに置き換えます

ファイル/読み取り/ディスク操作がすでに処理されていると仮定します...つまり、CSVの内容を含む文字列をこの関数に渡します。出力は、まっすぐな単純なHTMLスタイルのないマークアップで構成されます。はい、データにカンマや区切りが含まれている可能性があります。

更新: 何人かの人々が尋ねました。私が扱っているCSVの100%は、それが役立つのであれば、Excelから直接得られます。

文字列の例:

a1、b1、c1 \ r \ n
a2、b2、c2 \ r \ n
4

3 に答える 3

7

すべての行をメモリに読み込む

    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>");
    }

または一度に 1 行ずつ読み取る

    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 を使用して拡張バージョンを作成しました。これがハイライトです...(行読み取りの遅延評価)

    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]);
于 2009-06-08T20:55:57.370 に答える
2

おそらくこれよりもはるかに短くはなりませんが、実際のソリューションでは、引用符、引用符内のコンマ、および html エンティティへの変換が処理されることを覚えておいてください。

return "<table><tr><td>"+s
   .Replace("\n","</td></tr><tr><td>")
   .Replace(",","</td><td>")+"</td></tr></table>";

編集:これは(ほとんどテストされていない)htmlencodeと引用一致の追加です。最初に html エンコードすると、すべてのコンマが '<' になります (既存のコンマは既にエンコードされているため、衝突しません。

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>";
于 2009-06-08T22:50:52.567 に答える