Как в матлаб загрузить данные из файла
Перейти к содержимому

Как в матлаб загрузить данные из файла

  • автор:

Как в матлаб загрузить данные из файла

Серия iPhone от Apple редко чем удивляет. Когда вы получаете новый iPhone, общее впечатление, скорее всего, будет очень похожим на ваше предыдущее устройство. Однако всё совсем не так в лагере владельцев устройств на Android. Существуют телефоны Android всех форм и размеров, не говоря уже о разных ценовых категориях. Другими словами, Android-телефон может подойти многим. Однако поиск лучших телефонов на Android может быть сложной задачей.

Импорт и экспорт данных

Функция dlmread (чтение из текстовых файлов) предназначена для чтения матриц из текстовых файлов. Первый аргумент функции – имя файла. Результат записывается в матрицу.

>> a = dlmread('mat1.txt') a = 1 2 3 4 5 6 7 8 9 10 11 12 

Вторым аргументом можно явно указать разделитель чисел в файле, например ‘,’

>> b = dlmread('mat2.txt',','); 

Чтобы узнать размер прочитанной матрицы по каждому измерению используется функция size, которая возвращает массив двух значений: количество прочитанных строк и столбцов:

>> size(b) ans = 3 2 

Чтобы узнать общее число прочитанных чисел можно перемножив размеры матрицы, используя функцию prod

>> prod(size(b)) ans = 6 

или использовать функцию numel (количество всех элементов)

>> numel(b) ans = 6 

Третий и четвертый аргумент dlmread смещение строки и столбца, начиная с которых нужно начинать считывать данные из файла. Например, чтобы пропустить 1 строку и один столбец, необходимо вызвать функцию со следующими дополнительными параметрами

>> b = dlmread('mat2.txt',',', 1, 1) b = 5 6 8 9 11 12 

Чтение данных из Excel файлов

Для чтение данных из XLS файлов используется функция xlsread

>> xlsNum = xlsread('Данные.xlsx'); >> xlsNum 5 6 8 9 11 12 

### Функция readtable

Функция позволяет импортировать таблицы из файлов различных форматов. В отличие от результата работы функции xlsread результатом работы функции readtable является объект table, который содержит дополнительную информацию о таблице: об именах столбцов, строк. Без дополнительных указаний функция readtable считает, что в первой строке таблицы записаны имена её столбцов.

В рабочем каталоге MATLAB находится xls-файл следующего на листе “Лист1” которого находятся следующие данные:

Результатом работы функции readtable будет таблица (объект table)

>> data = readtable('Книга1.xlsx') data = 3×3 table Var1 COL1 COL2 ______ ____ ____ 'ROW1' 1.5 2 'ROW2' 1.6 3 'ROW3' 1.9 4 

Первая строка в первом столбце таблицы не содержит никаких значений (ячейка А1 пустая), поэтому первому столбцу было присвоено имя автоматически Var1. Второй и третий столбцы в таблице имеют имена COL1 и COL2 соответственно. Функция readtable рассматривает эти значения как имена столбцов. Если такое поведение функции readtable нежелательно, то можно передать функции значение ‘ReadVariableNames’ равное false

>> data = readtable('Книга1.xlsx', 'ReadVariableNames', false) data = 4×3 table Var1 Var2 Var3 ______ ______ ______ '' 'COL1' 'COL2' 'ROW1' '1.5' '2' 'ROW2' '1.6' '3' 'ROW3' '1.9' '4' 

Видно, что в этом случае, поскольку столбцы исходной таблицы в таком представлении содержат неоднородные данные (и числа и строки), все значения в столбцах рассматриваются как строковые без попыток их преобразования в числовые значения. Для корректного чтения данных из таблицы ‘Книга1.xlsx’ необходимо использовать поведение функции readtable по умолчанию, т.е.

>> data = readtable('Книга1.xlsx') data = 3×3 table Var1 COL1 COL2 ______ ____ ____ 'ROW1' 1.5 2 'ROW2' 1.6 3 'ROW3' 1.9 4 

В этом случае можно получить содержимое столбца, используя его имя. Например data.COL1 представляет собой матрицу столбец

>> data.COL1 ans = 1.5000 1.6000 1.9000 

Столбец data.Var1 это матрица ячеек, содержащая строковые значения

>> data.Var1 ans = 3×1 cell array 'ROW1'> 'ROW2'> 'ROW3'> 

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

>> data.Properties.VariableNames ans = 1×3 cell array 'Var1'> 'COL1'> 'COL2'> 

Для того, чтобы значения в первом столбце рассматривались как имена строк, необходимо использовать опцию ReadRowNames

>> data = readtable('Книга1.xlsx','ReadRowNames',true) data = 3×2 table COL1 COL2 ____ ____ ROW1 1.5 2 ROW2 1.6 3 ROW3 1.9 4 

Для чтения извлечения данных из строки по её имени используется следующий синтаксис

>> data('ROW1',:) ans = 1×2 table COL1 COL2 ____ ____ ROW1 1.5 2 

Результатом является объект типа table. Можно извлечь несколько строк по их именам, например так

>> data('ROW1', 'ROW2'>,:) ans = 2×2 table COL1 COL2 ____ ____ ROW1 1.5 2 ROW2 1.6 3 

Чтобы извлечь данные в виде матрицы необходимо использовать свойство таблицы Variables

>> data('ROW1',:).Variables ans = 1.5000 2.0000 

Для исходной таблицы это свойство вернет все числовые значения в виде матрицы

>> data.Variables ans = 1.5000 2.0000 1.6000 3.0000 1.9000 4.0000 

Экспорт данных

Сохранение таблицы в файле ‘data.txt’

writetable(data,'data.txt') 

Сохранение в файле имён строк

writetable(data,'data.txt','WriteRowNames',true) 

© 2023. All rights reserved.

importdata

A = importdata( filename ) данные о загрузках в массив A .

A = importdata(‘-pastespecial’) данные о загрузках из системного буфера обмена, а не из файла.

A = importdata( ___ , delimiterIn ) интерпретирует delimiterIn как разделитель столбцов в ASCII-файле, filename , или данные о буфере обмена. Можно использовать delimiterIn с любым из входных параметров в вышеупомянутых синтаксисах.

A = importdata( ___ , delimiterIn , headerlinesIn ) данные о загрузках из ASCII-файла, filename , или буфер обмена, считывая числовые данные, начинающие с линии headerlinesIn+1 .

[ A , delimiterOut , headerlinesOut ] = importdata( ___ ) дополнительно возвращает обнаруженный символ-разделитель для входа ASCII-файл в delimiterOut и обнаруженное количество линий заголовка в headerlinesOut , использование любого из входных параметров в предыдущих синтаксисах.

Примеры

Импорт и отображение изображения

Импортируйте и отобразите демонстрационное изображение, ngc6543a.jpg .

A = importdata('ngc6543a.jpg'); image(A)

Figure contains an axes object. The axes object contains an object of type image.

Выход, A , класс uint8 потому что функция помощника, imread , возвращает пустые результаты для colormap и alpha .

Импорт текстового файла и определение разделителя и заголовка столбца

Используя текстовый редактор, создайте разграниченный пробелом ASCII-файл с заголовками столбцов под названием myfile01.txt .

Day1 Day2 Day3 Day4 Day5 Day6 Day7 95.01 76.21 61.54 40.57 5.79 20.28 1.53 23.11 45.65 79.19 93.55 35.29 19.87 74.68 60.68 1.85 92.18 91.69 81.32 60.38 44.51 48.60 82.14 73.82 41.03 0.99 27.22 93.18 89.13 44.47 17.63 89.36 13.89 19.88 46.60

Импортируйте файл, задав разделитель пробела и заголовок отдельного столбца.

filename = 'myfile01.txt'; delimiterIn = ' '; headerlinesIn = 1; A = importdata(filename,delimiterIn,headerlinesIn);

Просмотрите столбцы 3 и 5.

for k = [3, 5] disp(A.colheaders) disp(A.data(:, k)) disp(' ') end 
Day3 61.5400 79.1900 92.1800 73.8200 17.6300 Day5 5.7900 35.2900 81.3200 0.9900 13.8900

Импорт текстового файла и возврат обнаруженного разделителя

Используя текстовый редактор, создайте разграниченный запятой ASCII-файл по имени myfile02.txt .

1,2,3 4,5,6 7,8,9

Импортируйте файл и отобразите выходные данные и обнаруженный символ-разделитель.

filename = 'myfile02.txt'; [A,delimiterOut]=importdata(filename)
A = 1 2 3 4 5 6 7 8 9 delimiterOut = ,

Импортирование данных от буфера обмена

Скопируйте следующие строки к буферу обмена. Выберите текст, щелкните правой кнопкой, и затем выберите Copy.

1,2,3 4,5,6 7,8,9

Импортируйте данные о буфере обмена в MATLAB ® путем ввода следующего.

A = importdata('-pastespecial')
A = 1 2 3 4 5 6 7 8 9

Входные параметры

filename — Имя и расширение файла, чтобы импортировать
вектор символов | строковый скаляр

Имя и расширение файла, чтобы импортировать в виде вектора символов или строкового скаляра. Если importdata распознает расширение файла, оно вызывает функцию помощника MATLAB, спроектированную, чтобы импортировать связанный формат файла (такой как load для MAT-файлов или xlsread для электронных таблиц). В противном случае, importdata интерпретирует файл как разграниченный ASCII-файл.

Для ASCII-файлов и электронных таблиц, importdata ожидает находить числовые данные в прямоугольной форме (то есть, как матрица). Заголовки текста могут появиться выше или слева от числовых данных, можно следующим образом:

  • Заголовки столбцов или текст описания файла наверху файла, выше числовых данных.
  • Заголовки строки слева от числовых данных.

Пример: ‘myFile.jpg’

Типы данных: char | string

delimiterIn — Символ разделителя столбцов
вектор символов | строковый скаляр

Символ разделителя столбцов в виде вектора символов или строкового скаляра. Символ по умолчанию интерпретирован из файла. Используйте ‘\t’ для вкладки.

Пример: ‘,’

Пример: ‘ ‘

Типы данных: char | string

headerlinesIn — Количество линий заголовка текста в ASCII-файле
неотрицательное скалярное целое число

Количество линий заголовка текста в ASCII-файле в виде неотрицательного скалярного целого числа. Если вы не задаете headerlinesIn , importdata функция обнаруживает это значение в файле.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Выходные аргументы

A — Данные из файла
матрица | многомерный массив | скалярный массив структур

Данные из файла, возвращенного как матрица, многомерный массив или скалярный массив структур, в зависимости от характеристик файла. На основе формата файла входного файла, importdata вызывает функцию помощника, чтобы считать данные. Когда функция помощника возвращает больше, чем один непустой выходной параметр, importdata комбинирует выходные параметры в struct массив.

Эта таблица приводит форматы файлов, сопоставленные с функциями помощника, которые могут возвратить больше, чем один выходной параметр и возможные поля в массиве структур, A .

Одно поле для каждой переменной

Сопоставленный с каждой переменной.

ASCII-файлы и электронные таблицы

data
textdata
colheaders
rowheaders

Для ASCII-файлов, data содержит double массив. Другие поля содержат cell массивы векторов символов. textdata включает заголовки строки и столбца.
Для электронных таблиц каждое поле содержит struct , с одним полем для каждого рабочего листа.

cdata
colormap
alpha

Функции помощника MATLAB для большинства других поддерживаемых форматов файлов возвращают один выходной параметр. Для получения дополнительной информации о классе каждого выхода, смотрите функции, перечисленные в Поддерживаемых Форматах файлов для Импорта и экспорта.

Если ASCII-файл или электронная таблица содержат или столбец или заголовки строки, но не обоих, importdata возвращает colheaders или rowheaders поле в структуре output, где:

  • colheaders содержит только последнюю линию текста заголовка столбца. importdata хранилища весь текст в textdata поле .
  • rowheaders создается только, когда файл или рабочий лист содержат отдельный столбец заголовков строки.

delimiterOut — Обнаруженный разделитель столбцов во входе ASCII-файл
символьный вектор

Обнаруженный разделитель столбцов во входе ASCII-файл, возвращенный как вектор символов.

headerlinesOut — Обнаруженное количество линий заголовка текста во входе ASCII-файл
целое число

Обнаруженное количество линий заголовка текста во входе ASCII-файл, возвращенный как целое число.

Советы

  • Импортировать ASCII-файлы с нечисловыми символами за пределами столбца или заголовков строки, включая столбцы символьных данных или отформатированных дат или времена, использование readtable вместо importdata .

Смотрите также

Темы

  • Поддерживаемые форматы файлов для импорта и экспорта
  • Импортируйте текстовые файлы
  • Импортируйте электронные таблицы
  • Импорт или экспорт последовательность файлов

Представлено до R2006a

Открытый пример

У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?

Документация MATLAB

Поддержка

  • MATLAB Answers
  • Помощь в установке
  • Отчеты об ошибках
  • Требования к продукту
  • Загрузка программного обеспечения

© 1994-2021 The MathWorks, Inc.

  • Условия использования
  • Патенты
  • Торговые марки
  • Список благодарностей

Для просмотра документации необходимо авторизоваться на сайте
Войти
Памятка переводчика

1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.

2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.

3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.

4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.

5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.

load

load( filename ) данные о загрузках из filename .

  • Если filename MAT-файл, затем load(filename) переменные загрузок в MAT-файле в MATLAB ® рабочая область.
  • Если filename ASCII-файл, затем load(filename) создает массив с двойной точностью, содержащий данные из файла.

load( filename , variables ) загружает заданные переменные из MAT-файла, filename .

load( filename ,’-ascii’) обработки filename как ASCII-файл, независимо от расширения файла.

load( filename ,’-mat’) обработки filename как MAT-файл, независимо от расширения файла.

load( filename ,’-mat’, variables ) загружает заданные переменные из filename .

S = load( ___ ) данные о загрузках в S , использование любого из входных параметров в предыдущей группе синтаксиса.

  • Если filename MAT-файл, затем S массив структур.
  • Если filename ASCII-файл, затем S массив с двойной точностью, содержащий данные из файла.

load filename форма команды синтаксиса. Форма команды требует меньшего количества специальных символов. Вы не должны вводить круглые скобки или заключать вход в одинарные или двойные кавычки. Разделите входные параметры пробелами вместо запятых.

Например, чтобы загрузить файл с именем durer.mat , эти операторы эквивалентны:

load durer.mat % command form load('durer.mat') % function form

Можно включать любые из входных параметров, описанных в предыдущих синтаксисах. Например, чтобы загрузить переменную под названием X :

load durer.mat X % command form load('durer.mat','X') % function form

Не используйте форму команды когда любые из входных параметров, таких как filename , переменные или строки.

Примеры

Загрузка всех переменных из MAT-файла

Загрузите все переменные из MAT-файла в качестве примера, gong.mat . Проверяйте содержимое рабочей области до и после операции загрузки.

disp('Contents of workspace before loading file:') whos disp('Contents of gong.mat:') whos('-file','gong.mat') load('gong.mat') disp('Contents of workspace after loading file:') whos

Также можно использовать синтаксис команд, чтобы загрузить переменные. Очистите ранее загруженные переменные и повторите load операция.

clear y Fs load gong.mat

Загрузка определенной переменной из MAT-файла

Загрузите только переменную y из файла в качестве примера handel.mat . Если рабочая область уже содержит переменную y , load операция перезаписывает его с данными из файла.

load('handel.mat','y')

Также можно использовать синтаксис команд, чтобы загрузить переменную, y .

load handel.mat y

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

Просмотрите содержимое файла в качестве примера, accidents.mat .

whos -file accidents.mat
Name Size Bytes Class Attributes datasources 3x1 2724 cell hwycols 1x1 8 double hwydata 51x17 6936 double hwyheaders 1x17 2758 cell hwyidx 51x1 408 double hwyrows 1x1 8 double statelabel 51x1 6596 cell ushwydata 1x17 136 double uslabel 1x1 138 cell

Используйте синтаксис функций, чтобы загрузить все переменные с именами, не начинающимися с ‘hwy’ , из файла.

load('accidents.mat', '-regexp', '^(?!hwy). ')

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

load accidents.mat -regexp '^(?!hwy). ' 

Загрузка списка переменных в массив структур

Файл, durer.mat , содержит переменные X , caption , и map . Создайте массив ячеек имен переменных, чтобы загрузить.

filename = 'durer.mat'; myVars = 'X','caption'>; S = load(filename,myVars)
S = struct with fields: X: [648x509 double] caption: [2x28 char]

Только переменные X и caption загружаются в массив структур, S .

Загрузка ASCII-ФАЙЛА

Создайте ASCII-файл из нескольких матриц с 4 столбцами и загрузите данные назад в массив с двойной точностью.

a = magic(4); b = ones(2, 4) * -5.7; c = [8 6 4 2]; save -ascii mydata.dat a b c clear a b c load mydata.dat -ascii

load создает массив типа double названный mydata .

Просмотрите информацию о mydata .

whos mydata
Name Size Bytes Class Attributes mydata 7x4 224 double

Входные параметры

filename — Имя файла
matlab.mat (значение по умолчанию) | вектор символов | строковый скаляр

Имя файла в виде вектора символов или строкового скаляра. Если вы не задаете filename , load функционируйте ищет файл с именем matlab.mat .

Если filename не имеет никакого расширения (то есть, никакой текст после периода), load ищет файл с именем filename.mat . Если filename имеет расширение кроме .mat , load функционируйте обрабатывает файл как данные о ASCII.

В зависимости от местоположения вашего файла, filename может взять одну из следующих форм.

Задайте имя файла в filename .

Пример: ‘myFile.mat’

Если файл не находится в текущей папке или в папке на пути MATLAB, то задайте полный или относительный путь в filename .

Пример: ‘C:\myFolder\myFile.mat’

Пример: ‘dataDir\myFile.mat’

Удаленные Местоположения (только MAT-файлы версии 7.3)

Если файл хранится в удаленном местоположении, то filename должен быть универсальный локатор ресурса (URL) этой формы:

scheme_name :// path_to_file / my_file.mat

На основе вашего удаленного местоположения, scheme_name может быть одно из значений в этой таблице.

Удаленное местоположение scheme_name
Amazon S3™ s3
Windows Azure ® Устройство хранения данных блоба wasb , wasbs
HDFS™ hdfs

load функционируйте только поддерживает MAT-файлы версии 7.3 загрузки от удаленных местоположений.

Для получения дополнительной информации о подготовке MATLAB, чтобы получить доступ к вашему сервису оперативного хранения, смотрите работу с Удаленными данными.

Пример: ‘s3://bucketname/path_to_file/my_file.mat’

При использовании формы команды load , вы не должны заключать вход в одинарные кавычки. Однако, если filename содержит пробел, необходимо заключить аргумент в одинарные кавычки. Например, load ‘filename withspace.mat’ .

Примечание

Не используйте форму команды когда filename строка.

ASCII-файлы должны содержать прямоугольную таблицу чисел с равным количеством элементов в каждой строке. Разделитель файла (символ между элементами в каждой строке) может быть пробелом, запятой, точкой с запятой или символом табуляции. Файл может содержать комментарии MATLAB (линии, которые начинаются со знака процента, % ).

variables — Имена переменных, чтобы загрузить
вектор символов | строковый скаляр

Имена переменных, чтобы загрузить в виде одного или нескольких вектор символов или строковый скаляр. При использовании формы команды load , вы не должны заключать вход в одинарные кавычки.

Примечание

Не используйте форму команды когда variables строка.

variables может быть в одной из следующих форм.

Форма variables Входной параметр Переменные, чтобы загрузить
var1. varN Загрузите перечисленные переменные в виде векторов отдельного символа или строк.
Используйте ‘*’ подстановочный знак, чтобы совпадать с шаблонами. Например, load(‘filename.mat’,’A*’) или load filename.mat A* загрузки все переменные в файле, имена которого запускаются с A .
‘-regexp’, expr1. exprN Загрузите только переменные или поля, имена которых совпадают с регулярными выражениями в виде векторов символов или строк. Например, load(‘filename.mat’,’-regexp’,’^Mon’,’^Tues’) или load filename.mat -regexp ^Mon ^Tues загрузки только переменные в файле, имена которого начинаются с Mon или Tues .

Выходные аргументы

S — Загруженные переменные или данные
массив структур | m — n массив

Загруженные переменные, возвращенные как массив структур, если filename MAT-файл.

Загруженные данные, возвращенные как m — n массив типа double , если filename ASCII-файл. m равно количеству линий в файле и n равно количеству значений на линии.

Ограничения

  • При работе с удаленными данными, load не поддерживает обработку входного файла как ASCII-файл.

Алгоритмы

Если вы не задаете выход для load функция, MATLAB создает переменную, названную в честь загруженного файла (минус любое расширение файла). Например, команда

load mydata.dat

считывает данные в переменную под названием mydata .

Создать имя переменной, load предшествует любым начальным символам подчеркивания или цифрам в filename с X и замены любые другие неалфавитные символы с символами нижнего подчеркивания. Например, команда

load 10-May-data.dat

создает переменную под названием X10_May_data .

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Указания и ограничения по применению:

  • Используйте load только при генерации MEX-функций или кода для Simulink ® симуляция. Чтобы загрузить константы времени компиляции, используйте coder.load .
  • Не поддерживает использование функции без присвоения на структуру или массив. Например, используйте S = load(filename) , не load(filename) .
  • Выход S должно быть имя структуры или массива без любого индексирования. Например, S(i) = load(‘myFile.mat’) не поддерживается.
  • Аргументы к load должно быть время компиляции постоянные векторы символов.
  • Если MAT-файл содержит неподдерживаемые построения, используйте S = load(filename,variables) загружать только поддерживаемые построения.
  • В функции, предназначенной для генерации кода, использования save или использование coder.extrinsic с save не поддерживается. Чтобы сохранить данные о рабочей области к MAT-файлу, используйте save функция до генерации кода.
  • При использовании load функционируйте, чтобы загрузить переменные, размер которых может измениться во время выполнения, необходимо явным образом объявить переменные как данные переменного размера при помощи coder.varsize .

Смотрите также

Темы

  • Поддерживаемые форматы файлов для импорта и экспорта
  • Сохранение и загрузка переменных рабочей области
  • Импортируйте текстовые файлы
  • Неожиданные результаты от совпадения имeн переменных и функций
  • Импорт или экспорт последовательность файлов
  • Выберите Command Syntax или Function Syntax

Представлено до R2006a

Открытый пример

У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?

Документация MATLAB

Поддержка

  • MATLAB Answers
  • Помощь в установке
  • Отчеты об ошибках
  • Требования к продукту
  • Загрузка программного обеспечения

© 1994-2021 The MathWorks, Inc.

  • Условия использования
  • Патенты
  • Торговые марки
  • Список благодарностей

Для просмотра документации необходимо авторизоваться на сайте
Войти
Памятка переводчика

1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.

2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.

3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.

4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.

5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *