Как разобрать txt файл?

201
25 февраля 2019, 23:50

Есть txt файл со следующей информацией:

2 дно, 1800, непроницаемая
Вторая платформа, 3500, проницаемая
Верхняя палуба, 7500, непроницаемая

Нужно разобрать данные в массив/массивы, но сохранив их принадлежность - то есть не перемешивая (2 дно, 1800, непроницаемая), так как каждая строка описывает высоту и свойство конкретного объекта. Считать построчно, каждое свойство объекта разделено запятыми, все они описывают название, положение и проницаемость объекта палуба. Как это организовать?

Answer 1

Можно считать весь файл в память, если он маленький:

        //1. считать все данные в память, если файл не большой
        var fileData = File.ReadAllLines("тут путь к файлу");
        foreach (var row in fileData)
        {
            var items = row.Split(",");
        }

Можно считывать построчно:

        //2. считать построчно
        using (StreamReader sr = new StreamReader("тут путь к файлу"))
        {
            while (sr.Read() > 0)
            {
                String row = sr.ReadLine();
                var items = row.Split(",");
            }
        }

И в том и в другом случае в объекте row будет содержаться массив из 3х строк. Далее его уже можно преобразовать в требуемый типизированный объект.

Еще можно воспользоваться сторонними библиотеками для парсинга, например CsvHelper. Но возможно это лишнее усложнение в вашей ситуации.

Answer 2

Этот формат данных называется CSV (Comma separated Value). Он довольно широко используется.

Вот здесь есть простой код с использованием внутренней библиотеки Visual Basic(это родная библиотека Visual Studio) которая считывает файл в двухмерный массив. Внешний массив - массив строк. Каждый внутренний массив - массив значений разделенных комой.

Как просто работать с / открыть / изменить / сохранить Excel / CSV файлы

Сложность чтения CSV заключается в том, что некоторые ячейки могут иметь внутри себя знак сепарации(кома в даном случае) и в таком случае вся ячейка должна обрамлятся в кавычки.

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

Так что в принципе я не советую мучится и делать собственную реализацию велосипеда CSV Reader-a с собственными костылями, а воспользоватся готовым решением. Тем более, что готовое решение является частью стоковых библиотек Visual Studio. Пример кода чтения в двухмерный массив можно найти по ссылке выше.

READ ALSO
Почему не обрабатывается сеттер?

Почему не обрабатывается сеттер?

У меня есть некоторое окно, вьюМодель к ней и контролОкно:

175
Растянуть TextBlock на всю ячейку grid WPF

Растянуть TextBlock на всю ячейку grid WPF

У меня есть ListBox, в котором каждый Item представляет собой Grid из трех колонокПервая и последняя колонка имеют ширину 50, а в средней лежит TextBlock,...

176
Правильно ли выполняется проверка на то что флаги совпадают?

Правильно ли выполняется проверка на то что флаги совпадают?

Имеется E'нумератор помеченный аттрибутом [Flags]:

170
Сборка проекта для .NET и .NET Core

Сборка проекта для .NET и .NET Core

При написании библиотеки, код которой валиден как дляNET Framework, так и для

181