Я пытаюсь прочитать файл CSV, чтобы я мог загрузить JQuery DataTable. Файл 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;
}
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>
Я получаю, что не могу преобразовать тип 'char' в 'string' в каждом из операторов foreach. Я попытался использовать var для строки var logFile = @ViewData ["data"], но остальное не работает.
Мое намерение состояло в том, чтобы извлекать строку массива Json за один раз, а затем разбивать каждую из них на один td. Как я могу использовать LogFileModel, чтобы содержать обработку данных, и создать представление и контроллер для этого?