Как загрузить CSV-файл в виде данных Json в веб-приложении MVC. Заголовок может быть разным - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь прочитать файл 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, чтобы содержать обработку данных, и создать представление и контроллер для этого?

1 Ответ

0 голосов
/ 05 января 2019

Я бы предложил другой подход.

Используйте TextFieldParser из Microsoft.VisualBasic.FileIO (Да, вы можете использовать это в C #), чтобы прочитать CSV и поместить его в качестве модели данных, а затем используйте Newtonsoft.Json для создания json из этих объектов.

Подробнее о TextFieldParser: https://coding.abel.nu/2012/06/built-in-net-csv-parser/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...