#rust
#Ржавчина
Вопрос:
У меня есть файл, содержащий информацию, которую я хочу загрузить в приложение. Файл содержит некоторую информацию заголовка в виде строки, затем несколько записей, которые заканчиваются на ‘;’ Некоторые записи используются для разных типов и поэтому длина является переменной, но все переменные разделены на ‘,’
Пример:
Some heading
Some other heading
I,003f,3f3d00ed,"Some string",00ef,
0032,20f3
;
Y,02d1,0000,0000,"Name of element",
00000007,0,
00000000,0,
;
Y,02d1,0000,0000,"Name of element",30f0,2d0f,02sd,
00000007,0,
00000000,0,
;
I — один тип элемента
Y — это другой тип элемента
Чего я хочу добиться, так это объединить элементы в разные структуры для работы. Большинство значений являются числами, но некоторые из них являются строками.
Чего я смог добиться, так это:
- Импортируйте файл как Vec<u8>
- Поместите его в строку (не могу сделать это напрямую, потому что в элементах, которые меня не интересуют, могут быть проблемы с UTF-8)
- Разделите его на Vec<amp;str> с помощью ‘;’
- Передавайте строки функциям в зависимости от их типа
- Разделите его на Vec с помощью ‘ n’
- Разделите его на Vec с помощью ‘,’
- Считываю нужные мне данные и интерпретирую их из строк (например, str::from_str_radix)
- Создайте структуру и верните ее
Похоже, это не тот путь, поскольку я начинаю с байтов, выделяю их как строку, а затем снова выделяю числа для большинства значений.
Итак, мой вопрос:
Могу ли я разделить Vec<u8> на несколько векторов, разделенных ‘;’ (байт 59), разделить их еще на ‘n’ и разделить это еще на ‘,’. Я предполагаю, что было бы более эффективно применять байты непосредственно к правильному типу данных. Или мое беспокойство неверно?
Комментарии:
1. Это звучит как задание для vec.split
2. @IvanC vec.split отвечает на заголовок, но я не думаю, что это решение. Мне кажется, что решение заключается в синтаксическом анализе, по крайней мере, ad-hoc, если не используется «правильная» библиотека синтаксического анализатора. Кроме того, вы не можете разделить a
Split
, поэтому вам придется изобрести схему для сопряжения разделителя разделения, чтобы узнать ваши 3 уровня границ, что в основном является специальным синтаксическим анализом, за исключением плохого.3. Вы точно настроены на формат конфигурации, который используете? Возможно, вы захотите изучить некоторые типизированные, легко сериализуемые форматы.
4. Я настроен на формат, потому что я прочитал файл из стороннего программного обеспечения
Ответ №1:
Могу ли я разделить Vec на несколько векторов, разделенных ‘;’ (байт 59), разделить их дальше на ‘ n’ и разделить это дальше на ‘,’.
Обычно это не сработает, если другие байты могут появляться в других местах, например, встроенных в строки.
Тогда возникает также вопрос о том, как кодируются строки, существуют ли escape-последовательности и т. Д.
Я предполагаю, что было бы более эффективно применять байты непосредственно к правильному типу данных. Или мое беспокойство неверно?
Чтение всего файла в память, а затем выполнение нескольких копий из одного Vec
в другой Vec
и так далее будет медленнее, чем один проход с помощью какого-либо конечного автомата. Не говоря уже о том, что это сделает работу с файлами размером больше памяти чрезвычайно медленной или невозможной.
Я бы не стал беспокоиться о производительности, пока у вас не будет работающего алгоритма, в частности, если вам приходится работать с недокументированным, нетривиальным сторонним форматом, и у вас нет опыта чтения двоичных форматов.