C# 如何在MVC web应用程序中将csv文件作为Json数据加载。标题可以不同

C# 如何在MVC web应用程序中将csv文件作为Json数据加载。标题可以不同,c#,json,asp.net-mvc,datatables,C#,Json,Asp.net Mvc,Datatables,我正在尝试读取csv文件,以便加载jQuery数据表。csv文件可能有不同的标题。我使用标题为jQuery表创建列。然后加载文件并创建行。我直接从csv文件中执行此操作,所有操作都正常,但前提是文件很小。我需要转向使用Json,以便实现一种使用Linq在代码的模型部分进行排序、过滤和查询的方法。在尝试转移到MVC模型时,我陷入了无法从Json数据中提取行的境地 这里是ViewFile,它当前有LoadDataAsJson(我打赌它应该在Model类中)。它创建的Json是正确的 publi

我正在尝试读取csv文件,以便加载jQuery数据表。csv文件可能有不同的标题。我使用标题为jQuery表创建列。然后加载文件并创建行。我直接从csv文件中执行此操作,所有操作都正常,但前提是文件很小。我需要转向使用Json,以便实现一种使用Linq在代码的模型部分进行排序、过滤和查询的方法。在尝试转移到MVC模型时,我陷入了无法从Json数据中提取行的境地

这里是ViewFile,它当前有LoadDataAsJson(我打赌它应该在Model类中)。它创建的Json是正确的

   public IActionResult ViewFile()
    {
        string fileName = Request.Form["fileName"];
        ViewData["name"] = fileName;
        ViewData["data"] = LoadDataAsJson(dir + Path.DirectorySeparatorChar + fileName, 100);
        return View();
    }

    private string LoadDataAsJson(string fileName, int limit)
    {
        string[] headers = new string[8];
        StringBuilder bldr = new StringBuilder();
        bldr.Append("[");
        using (TextReader reader = new StreamReader(fileName))
        {
            String line = null;
            int k = 0;
            while ((line = reader.ReadLine()) != null)
            {
                if (k > limit)
                    break;
                if (k++ != 0)
                {
                    if (k != 2)
                        bldr.Append(","); // append a comma to the end of previous line
                    List<string> aRow = FormatAsJsonArray(line);
                    bldr.AppendLine();
                    bldr.Append("{");
                    for (int i = 0; i < headers.Length; i++)
                    {
                        bldr.Append(headers[i]);
                        bldr.Append(":\"");
                        bldr.Append(aRow[i]);
                        bldr.Append("\"");
                        if (i != headers.Length - 1)
                            bldr.Append(",");
                    }
                    bldr.Append("}");
                }
                else
                {
                    headers = line.Split(',');
                }
            }
        }
        bldr.Append(Environment.NewLine + "]" + Environment.NewLine);
        return bldr.ToString();
    }

    private List<string> FormatAsJsonArray(string aLine)
    {
        int k = 0;
        string[] tokens = aLine.Split(',');
        List<string> items = new List<string>();
        string lastPart = "";
        if (tokens.Length > 6)
        {
            for (int i = 7; i < tokens.Length; i++)
            {
                lastPart = String.Concat(lastPart, tokens[i]);
                if (i != tokens.Length - 1)
                    lastPart += ",";

            }
        }

        for (int i = 0; i < tokens.Length; i++)
        {
            if (i > 8)
                break;
            if (tokens[i].Contains("["))
            {
                List<string> msecs = MsecColumnAsJson(tokens[i]);
                for (int kk = 0; kk < msecs.Count; kk++)
                    items.Add(msecs[kk]);
            }
            else if (k < 7)
                items.Add(tokens[i]);
            k++;
        }
        if (lastPart != null && lastPart.Length > 0)
            items.Add(lastPart);

        return items;
    }
public IActionResult ViewFile()
{
字符串fileName=Request.Form[“fileName”];
ViewData[“名称”]=文件名;
ViewData[“data”]=LoadDataAsJson(dir+Path.directorySpeparatorChar+fileName,100);
返回视图();
}
私有字符串LoadDataAsJson(字符串文件名,int限制)
{
字符串[]头=新字符串[8];
StringBuilder bldr=新的StringBuilder();
bldr.追加(“[”);
使用(TextReader=new StreamReader(文件名))
{
字符串行=null;
int k=0;
而((line=reader.ReadLine())!=null)
{
如果(k>限制)
打破
如果(k++!=0)
{
如果(k!=2)
bldr.Append(“,”;//在前一行末尾附加逗号
列表aRow=FormatAsJsonArray(行);
bldr.AppendLine();
bldr.Append(“{”);
for(int i=0;i6)
{
for(inti=7;i8)
打破
if(标记[i]。包含(“[”))
{
List msecs=MsecColumnAsJson(令牌[i]);
对于(int kk=0;kk0)
添加项目(最后一部分);
退货项目;
}
ViewFile.cshtml包含一部分

<h2>@ViewData["name"]</h2>
<div class="container">
    <br />
    <table id="table_id" class="table table-condensed table-striped table-hover display">
        <thead>
            <tr>
                <th>DateTime</th>
                <th>Msecs</th>
                <th>Thread</th>
                <th>Level</th>
                <th>Logger</th>
                <th>Host</th>
                <th>Msg Type</th>
                <th>Message</th>
            </tr>
        </thead>
        <tbody>
            @{
            string logFile = (string)@ViewData["data"];
            var k = 0;
            }
            @foreach (string lf logFile)
            {
            if (k++ > 50)
            {
            break;
            }
            <tr>
                @foreach (string item in lf)
                {
                <td>
                    @item
                </td>
                }
            </tr>
            }
        </tbody>
    </table>
</div>
@ViewData[“name”]

日期时间 微秒级 线 水平仪 记录器 主办 短消息类型 消息 @{ 字符串日志文件=(字符串)@ViewData[“data”]; var k=0; } @foreach(字符串lf日志文件) { 如果(k++>50) { 打破 } @foreach(左前的字符串项) { @项目 } }
我最终无法将每个foreach语句中的类型“char”转换为“string”。我尝试在var logFile=@ViewData[“data”]行中使用var,但其余的都不起作用


我的意图是一次在Json数组行上提取数据,然后将每个数据分解为一个td。我如何使用LogFileModel来包含数据处理,并创建一个视图和控制器来实现这一点?

我建议采用不同的方法

使用Microsoft.VisualBasic.FileIO中的
TextFieldParser
(是的,您可以在C#中使用它)读取CSV并将其作为数据模型放置,然后使用
Newtonsoft.Json
从该对象创建Json


这里有更多关于TextFieldParser的内容:

我以前做过一部分。如果您注意到,我正在使用TextReader读取csv。当然,Json格式可以被您所说的内容所取代。问题是如何将Json提取到ViewFile.cshtml中。只需将其转换回对象结构即可。