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