Запись информации в текстовый файл в Си
Для записи данных в файл в Си, необходимо открыть файл в режиме записиИмя указателя на файл= fopen(«путь к файлу», «w»);
Для записи в строку текстового файла используется команда fprnitf(), которая аналогична команде printf() вывод на экран в си только первый параметр это указатель на файлfprintf (имя указателя на файл,”%формат ввода”, переменные);
Например запись в файл out.txt значение переменной аa=10;
fout = fopen(«C:\\Users\\user\\Desktop\\out.txt», «w»);
fprintf (fout,”%d”, a);
Пример программы на си которая запрашивает два числа и записывает в файл out.txt оба эти числа и их сумму
#include <stdio.h>
#include <conio.h>
main()
{ int a;
int b;
int c;
FILE *fout;
fout = fopen(«C:\\Users\\user\\Desktop\\out.txt», «w»);
printf («введите первое число \n»);
scanf(«%d», &a);
printf («введите второе число \n»);
scanf(«%d», &b);
c=a+b;
fprintf(fout,»%d %d %d»,a,b,c);
getch();
fclose(fout);
}
Вернуться к содержанию Перейти к уроку Ошибки в программах на си
Поделиться
Ваш файл все еще не открывается?
Вы видите беспорядочный текст при открытии файла? Может быть, большая часть или все это совершенно нечитаемо. Наиболее вероятная причина этого заключается в том, что файл не является простым текстом.
Как мы упоминали выше, вы можете открыть любой файл с помощью Notepad ++, но, как и в примере с MP3, это не означает, что вы можете использовать этот файл там. Если вы попробуете ваш файл в текстовом редакторе, и он не рендерится так, как вы думаете, переосмыслите, как он должен открываться; это, вероятно, не в формате файла, который может быть объяснен в удобочитаемом тексте.
Если вы не знаете, как должен открываться ваш файл, попробуйте некоторые популярные программы, которые работают с различными форматами. Например, хотя Notepad ++ отлично подходит для просмотра текстовой версии файла, попробуйте перетащить файл в медиаплеер VLC, чтобы проверить, содержит ли он медиафайл, содержащий видео или звуковые данные.
Поиск строки
Чтобы с помощью Python найти строку в текстовом файле, стоит прибегнуть к помощи встроенного метода readlines, который позволяет автоматически считывать внутреннее содержимое файла. Как и раньше, для начала необходимо открыть test.txt для чтения, чтобы затем поместить данные из него в специальный массив lines. Встроенный метод index позволяет найти номер элемента в последовательности, просто передав ему нужный объект, например, строку “second”.
with open(r"D:\test.txt", "r") as file: lines = file.readlines() print(lines.index("second\n"))
Поскольку в test.txt все элементы располагаются в отдельных строках, к строке, которую стоит передать методу index в качестве аргумента, необходимо прибавить конструкцию “\n”.
Определение
- Пространство имен:
- System.IO
- Сборка:
- System.IO.dll
- Сборка:
- System.Runtime.dll
- Сборка:
- System.Runtime.Extensions.dll
- Сборка:
- mscorlib.dll
- Сборка:
- netstandard.dll
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Реализует TextWriter для записи символов в поток в определенной кодировке.
В этой статье
- Наследование
-
Object
TextWriter
StreamWriter
- Наследование
-
Object
MarshalByRefObject
TextWriter
StreamWriter
- Атрибуты
-
SerializableAttribute
ComVisibleAttribute
Открытие и закрытие файлов
До этого при вводе-выводе данных мы работали со стандартными потоками — клавиатурой и монитором. Теперь рассмотрим, как в языке C реализовано получение данных из файлов и запись их туда. Перед тем как выполнять эти операции, надо открыть файл и получить доступ к нему.
В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:
FILE *myfile;
С другой стороны, функция открывает файл по указанному в качестве первого аргумента адресу в режиме чтения («r»), записи («w») или добавления («a») и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:
myfile = fopen("hello.txt", "r");
Примечание. В случае использования относительной адресации текущим/рабочим каталогом в момент исполнения программы должен быть тот, относительно которого указанный относительный адрес корректен
Место нахождения самого исполняемого файла не важно
При чтении или записи данных в файл обращение к нему осуществляется посредством файлового указателя (в данном случае, myfile).
Если в силу тех или иных причин (нет файла по указанному адресу, запрещен доступ к нему) функция не может открыть файл, то она возвращает NULL. В реальных программах почти всегда обрабатывают ошибку открытия файла в ветке , мы же далее опустим это.
Объявление функции содержится в заголовочном файле stdio.h, поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE.
После того, как работа с файлом закончена, принято его закрывать, чтобы освободить буфер от данных и по другим причинам
Это особенно важно, если после работы с файлом программа продолжает выполняться. Разрыв связи между внешним файлом и указателем на него из программы выполняется с помощью функции
В качестве параметра ей передается указатель на файл:
fclose(myfile);
В программе может быть открыт не один файл. В таком случае каждый файл должен быть связан со своим файловым указателем. Однако если программа сначала работает с одним файлом, потом закрывает его, то указатель можно использовать для открытия второго файла.
Написать текстовый файл (пример 2)
Следующий код использует класс для открытия, записи и закрытия текстового файла. В отличие от предыдущего примера, этот код передает конструктору два дополнительных параметра. Первый параметр — путь к файлу и имя файла. Второй параметр указывает, что файл открыт в режиме приложения. Если вы указываете для второго параметра, содержимое файла перезаписывается при каждом запуске кода. Третий параметр указывает, чтобы кодировать файл в формате Unicode. Можно также указать следующие методы коди-кодинга для третьего параметра:
- ASC11
- Юникод
- UTF7
- UTF8
Метод похож на метод, за исключением того, что метод не автоматически встраит комбинацию символов возврата или строки (CR/LF). Это полезно, когда нужно одновременно писать по одному символу.
-
Запустите Visual Studio.
-
В меню Файл выберите пункт Создать и затем пункт Проект.
-
Нажмите кнопку Visual C# проектов Project типов, а затем нажмите консольное приложение в шаблонах.
-
Добавьте следующий код в начале файла Class1.cs:
-
Добавьте в метод следующий код:
-
В меню Отлаговка выберите Пуск для компиляции и запуска приложения. Этот код создает файл, которыйTest1.txt на диске C. Open Test1.txt в текстовом редакторе, например Блокнот. Test1.txt содержит одну строку текста: 0123456789.
Комментарии
StreamWriter класс предназначен для вывода символьных данных в определенной кодировке, тогда как классы, производные от Stream , предназначены для ввода и вывода байтов.
Важно!
Этот тип реализует интерфейс IDisposable. По окончании использования выдаленную ему память следует прямо или косвенно освободить. Чтобы сделать это прямо, вызовите его метод Dispose в блоке /. Чтобы сделать это косвенно, используйте языковые конструкции, такие как (в C#) или (в Visual Basic). Дополнительные сведения см. в разделе «Использование объекта, реализующего IDisposable» в статье об интерфейсе IDisposable.
StreamWriter по умолчанию использует экземпляр, UTF8Encoding если не указано иное. Этот экземпляр создается без метки порядка байтов (BOM), поэтому его GetPreamble метод возвращает пустой массив байтов. Кодировка по умолчанию UTF-8 для этого конструктора вызывает исключение для недопустимых байтов. Это поведение отличается от поведения, предоставленного объектом Encoding в Encoding.UTF8 свойстве. Чтобы указать СПЕЦИФИКАЦИю и определить, возникает ли исключение в недопустимых байтах, используйте конструктор, принимающий объект кодировки в качестве параметра, например или StreamWriter .
По умолчанию объект не StreamWriter является потокобезопасным. См TextWriter.Synchronized . раздел для потокобезопасной оболочки.
Список общих задач ввода-вывода см. в разделе Общие задачи ввода-вывода.
Запись текста в файл (Java 6)
Этот код запишет данные в файл (причём если файл существует, данные в нём будут перезаписаны).
// если файл существует, он перезатрётся PrintWriter writer = new PrintWriter("output.txt", "UTF-8"); writer.println("Первая строка"); writer.println("Вторая строка"); writer.close();
Если вам нужно дописать текст в конец файла, используйте следующий код:
// здесь мы допишем информацию в конец файла, если он уже существует PrintWriter writer2 = new PrintWriter((new FileWriter("output.txt", true))); writer2.println("Третья строка"); writer2.close();
Для записи бинарных данных в файл в Java 6 используйте следующий код (информация в файле перезапишется):
// запись в файл бинарной информации (файл перезаписывается) OutputStream os = new FileOutputStream("output.bin"); byte[] data = "какие-то бинарные данные".getBytes(); os.write(data); os.close();
Для добавления бинарных в конец файла в Java используйте следующий код:
// запись в файл бинарной информации (информация добавляется в конец файла) OutputStream osB = new FileOutputStream("output.bin", true); byte[] dataB = "какие-то бинарные данные".getBytes(); osB.write(dataB); osB.close();
Удаление строки
Чтобы в Python удалить ненужную строку из файла, следует воспользоваться сразу двумя режимами обработки файлов: чтение и запись. Для начала необходимо открыть test.txt для чтения, чтобы поместить информацию из него в отдельный массив lines. Далее потребуется удалить один из элементов последовательности при помощи оператора del, указав ему индекс нужной строки в квадратных скобках. Массив объектов, который получился в итоге, необходимо поместить в исходный текстовый файл, однако на этот раз открыть его надо в режиме записи.
with open(r"D:\test.txt", "r") as file: lines = file.readlines() del lines with open(r"D:\test.txt", "w") as file: file.writelines(lines)
Приведенный выше пример небольшой программы демонстрирует удаление строки из файла. В данном случае используются методы readlines и writelines, позволяющие считывать массив строк из документа и записывать его туда же, разделяя отдельные элементы списка.
Обратите внимание, что в приведенном примере удалится вторая строка, так как индексы списка считаются от нулевого элемента.
Таким образом, можно достаточно легко взаимодействовать с содержимым текстовых файлов, пользуясь языком программирования Python 3. Его встроенные функции позволяют записывать данные в документ и считывать их в удобном для пользователя виде. При помощи средств по расширенной работе с файлами, можно управлять ими на куда более продвинутом уровне.
Создание, открытие и закрытие файла
Работа с любым текстовым файлом в Python начинается с вызова специальной функции open, которая принимает в качестве параметров путь к объекту на компьютере и режим обработки. Путь к документу можно указать как абсолютный (адрес расположения на жестком диске ПК), так и как относительный (координаты относительно папки проекта). Выбирая нужный режим обработки файла, следует учитывать его назначение (“w” для записи, “r” для чтения данных). Следующий пример показывает простое взаимодействие с текстовым документом.
file = open("test.txt", "w") file.write("hello world") file.close()
Как можно заметить, функция open принимает относительный путь файла и открывает его для записи. Если в папке с исходным кодом документа с аналогичным именем и расширением .txt не существует, метод open создает его самостоятельно, после чего открывает для него нужный режим обработки. Выполнив все необходимые действия с переменной file, которая ссылается на реальный файл, следует вручную закрыть его, чтобы избежать потери информации. Данную задачу выполняет метод close, если вызвать его при помощи оператора доступа (точки).
Выполнить точно такие же действия, но без необходимости вручную закрывать файл, вполне возможно благодаря связке операторов with as. Для этого необходимо поместить метод open сразу после ключевого слова with, а переменную, которая будет ссылаться на файл, прописать за конструкцией as. Ниже располагается пример открытия документа с помощью with as.
with open("test.txt", "w") as file: file.write("hello world")
Оба примера небольших программ демонстрируют работу с test.txt, который генерируется в каталоге с исходным кодом. В качестве режима обработки для него выбирается запись данных. После этого при помощи метода write в него заносится строка “hello world”. Завершается код в обоих случаях закрытием текстового файла test.txt методом close или автоматически.
ЗаписьТекста
Для последовательной записи текста используется следующий алгоритм:
- Создается объект ЗаписьТекста.
- У данного объекта вызывается метод Открыть, первым параметром нужно указать путь к файлу.
- Для записи каждой строки вызывается метод ЗаписатьСтроку, которому параметром передается записываемая строка.
- Для закрытия текстового файла вызывается метод Закрыть.
ПутьКФайлу = «F:\Текст док.txt»;
Запись = Новый ЗаписьТекста;
Запись.Открыть(ПутьКФайлу);
Запись.ЗаписатьСтроку(«Первая строка»);
Запись.ЗаписатьСтроку(«Вторая строка»);
Запись.ЗаписатьСтроку(«Третья строка»);
Запись.Закрыть();
1 |
ПутьКФайлу= «F:\Текст док.txt»; Запись= Новый ЗаписьТекста; Запись.Открыть(ПутьКФайлу); Запись.ЗаписатьСтроку(«Первая строка»); Запись.ЗаписатьСтроку(«Вторая строка»); Запись.ЗаписатьСтроку(«Третья строка»); Запись.Закрыть(); |
В результате будет записан следующий текстовый файл:
Если такого файла на диске еще не было, то он будет создан. Если в файле уже что-то было, то он будет перезаписан.
Можно не использовать метод Открыть, а указать путь к файлу в конструкторе объекта ЗаписьТекста:
Запись = Новый ЗаписьТекста(ПутьКФайлу);
1 | Запись= Новый ЗаписьТекста(ПутьКФайлу); |
Кодировку текста можно указать вторым параметром или в конструкторе объекта ЗаписьТекста или в методе Открыть:
Кодировка = «UTF-16LE»;
Запись = Новый ЗаписьТекста(ПутьКФайлу, Кодировка);
1 |
Кодировка= «UTF-16LE»; Запись= Новый ЗаписьТекста(ПутьКФайлу,Кодировка); |
Если кодировка не указана, то используется UTF-8.
Третьим параметром можно переопределить разделитель строк (по умолчанию используется Символы.ПС, LF). Например, можно указать символ процента:
Разделитель = «%»;
Запись = Новый ЗаписьТекста(ПутьКФайлу,, Разделитель);
1 |
Разделитель= «%»; Запись= Новый ЗаписьТекста(ПутьКФайлу,,Разделитель); |
В этом случае текстовый файл будет выглядеть так:
Также разделитель строк можно указать вторым параметром в методе ЗаписатьСтроку:
Запись.ЗаписатьСтроку(«Первая строка», «%»);
1 | Запись.ЗаписатьСтроку(«Первая строка»,»%»); |
В этом случае можно использовать разные разделители после записи каждой строки.
Можно вообще не записывать разделитель строк после записанной строки. В этом случае вместо метода ЗаписатьСтроку нужно использовать метод Записать:
Запись.Записать(«Первая строка»);
1 | Запись.Записать(«Первая строка»); |
В этом случае можно сформировать текст файла отдельно, а потом записать его методом Записать:
ПутьКФайлу = «F:\Текст док.txt»;
Текст = «Первая строка» + Символы.ПС +
«Вторая строка» + Символы.ПС +
«Третья строка» + Символы.ПС;
Запись = Новый ЗаписьТекста(ПутьКФайлу);
Запись.Записать(Текст);
Запись.Закрыть();
1 |
ПутьКФайлу= «F:\Текст док.txt»; Текст= «Первая строка»+Символы.ПС+ «Вторая строка»+Символы.ПС+ «Третья строка»+Символы.ПС; Запись.Записать(Текст); Запись.Закрыть(); |
Если нужно добавить что-то к уже существующему файлу, то четвертым параметром нужно указать Истина:
Запись = Новый ЗаписьТекста(ПутьКФайлу,,, Истина);
1 | Запись= Новый ЗаписьТекста(ПутьКФайлу,,,Истина); |
В этом случае, если дважды записать в один файл, то будет получен следующий текстовый файл:
Создание пользовательских функций
Если часто используется одна и та же последовательность команд, то целесообразнее создать функцию, которая бы их выполняла автоматически. Это существенно упрощает текст программы, делает его более модульным, читабельным и простым для внесения изменений.
Создадим простейшую функцию рассчитывающую разность двух векторов
Применим ее
Важно отметить, что при передаче параметров в функции, можно не использовать названия параметров только в том случае, если соблюдается порядок следования параметров. В противном случае необходимо указывать названия параметров
Продемонстрируем области видимости переменных на примере собственных функций.
Создадим вектор и вызовем созданную нами функцию. Результат функции это измененный вектор , однако сам вектор не изменился.
Таким образом все что передается в функцию попадает в локальную области видимости только этой функции как и все изменения.
Реализуем собственную функцию загрузки бинарных файлов
Для того чтобы сохранить созданную функцию текст функции посещается в (новый) файл R script, который можно создать вызвав меню File — New file — R script или нажав комбинацию Ctrl + Shift + N. После чего пишется текст функции и файл сохраняется с расширением “.R”.
Для загрузки функции из файла используется функция . Но предварительно очистим содержимое рабочей области.
После чего для загрузки бинарного файла достаточно вызвать
Ранее для чтения текстового файла с дескрипторами мы использовали следующий вызов.
Если часто использовать ее для чтения файлов, то удобнее создать собственную функцию. Создадим два варианта.
Первый вариант
Второй вариант
Тогда для загрузки файлов с дескрипторами достаточно вызвать
или
Какие достоинства и недостатки у каждого из вариантов?
Файлы в Python
В целом различают два типа файлов (и работы с ними):
- текстовые файлы со строками неопределенной длины;
- двоичные (бинарные) файлы (хранящие коды таких данных, как, например, рисунки, звуки, видеофильмы);
Этапы работы с файлом:
- открытие файла;
- режим чтения,
- режим записи,
- режим добавления данных.
работа с файлом;
закрытие файла.
В python открыть файл можно с помощью функции open с двумя параметрами:
- имя файла (путь к файлу);
- режим открытия файла:
- «r» – открыть на чтение,
- «w» – открыть на запись (если файл существует, его содержимое удаляется),
- «a» – открыть на добавление.
В коде это выглядит следующим образом:
Fin = open ( "input.txt" ) Fout = open ( "output.txt", "w" ) # работа с файлами Fout.close() Fin.close() |
Работа с текстовыми файлами в Питон
Чтение из файла происходит двумя способами:
- построчно с помощью метода readline:
файл input.txt:
1
2
3
str1 = Fin.readline() # str1 = 1 str2 = Fin.readline() # str2 = 2 |
метод read читает данные до конца файла:
файл input.txt:
1
2
3
str = Fin.read() ''' str = 1 2 3 ''' |
Для получения отдельных слов строки используется метод split, который по пробелам разбивает строку на составляющие компоненты:
str = Fin.readline().split() print(str) print(str1) |
Пример:
В файле записаны два числа. Необходимо суммировать их.
файл input.txt:
12 17
ответ:
27
Решение:
- способ:
Fin = open ( "D:/input.txt" ) str = Fin.readline().split() x, y = int(str), int(str1) print(x+y) |
способ:
... x, y = int(i) for i in s print(x+y) |
* Функция int преобразует строковое значение в числовое.
В python метод write служит для записи строки в файл:
Fout = open ( "D:/out.txt","w" ) Fout.write ("hello") |
Запись в файл можно осуществлять, используя определенный
шаблон вывода. Например:
Fout.write ( "{:d} + {:d} = {:d}\n".format(x, y, x+y) ) |
В таком случае вместо шаблонов {:d} последовательно подставляются значения параметров метода format (сначала x, затем y, затем x+y).
Аналогом «паскалевского» eof (если конец файла) является обычный способ использования цикла while или с помощью добавления строк в список:
-
while True: str = Fin.readline() if not str: break
-
Fin = open ( "input.txt" ) lst = Fin.readlines() for str in lst: print ( str, end = "" ) Fin.close()
- подходящий способ для Python:
for str in open ( "input.txt" ): print ( str, end = "" ) |
Задание Python 9_1:
Считать из файла input.txt 10 чисел (числа записаны через пробел). Затем записать их произведение в файл output.txt.
Рассмотрим пример работы с массивами.
Пример:
Считать из текстового файла числа и записать их в другой текстовый файл в отсортированном виде.
Решение:
- Поскольку в Python работа с массивом осуществляется с помощью структуры список, то количество элементов в массиве заранее определять не нужно.
- Считывание из файла чисел:
lst = while True: st = Fin.readline() if not st: break lst.append (int(st)) |
Сортировка.
Запись отсортированного массива (списка) в файл:
Fout = open ( "output.txt", "w" ) Fout.write (str(lst)) # функция str преобразует числовое значение в символьное Fout.close() |
Или другой вариант записи в файл:
for x in lst: Fout.write (str(x)+"\n") # запись с каждой строки нового числа |
Задание Python 9_2:
В файле записаны в целые числа. Найти максимальное и минимальное число и записать в другой файл.
Задание Python 9_3:
В файле записаны в столбик целые числа. Отсортировать их по возрастанию суммы цифр и записать в другой файл.
Рассмотрим на примере обработку строковых значений.
Пример:
В файл записаны сведения о сотрудниках некоторой фирмы в виде:
Иванов 45 бухгалтер
Необходимо записать в текстовый файл сведения о сотрудниках, возраст которых меньше 40.
Решение:
- Поскольку сведения записаны в определенном формате, т.е. вторым по счету словом всегда будет возраст, то будем использовать метод split, который разделит слова по пробелам. Под номером 1 в списке будет ити возраст:
st = Fin.readline() data = st.split() stAge = data1 intAge = int(stAge) |
Более короткая запись будет выглядеть так:
st = Fin.readline() intAge = int(st.split()1) |
Программа выглядит так:
while True: st = Fin.readline() if not s: break intAge = int (st.split()1) |
Но лучше в стиле Python:
for st in open ( "input.txt" ): intAge = int (st.split()1) if intAge < 40: Fout.write (st) |
Задание Python 9_4:
В файл записаны сведения о детях детского сада:
Иванов иван 5 лет
Необходимо записать в текстовый файл самого старшего и самого младшего.
Манипуляции с данными
Векторы
Загрузим файл и определим среднее значение растворимости в выборке, медианное значение, максимальное и минимальное значения.
Все приведенные функции векторизированы, поэтому расчет происходит очень быстро и эффективно.
Функция возвращает всю вышеприведенную статистику в виде одного вектора значений.
Помимо этих есть еще множество функций рассчета различных статистических характеристик.
Data.frames
Продемонстрируем работу с data.frames на примере.
Есть два набора соединений с рассчитанными дескрипторами и их необходимо объединить в один data.frame.
Загрузим оба имеющихся файла данных:
Проверим размерность загруженных данных. Функция возвращает размерность данных (число строк и число столбцов), другими словами число соединений и число дескрипторов.
Поскольку число дескрипторов отличается, то выясним какие дескрипторы отсутствуют в каждом из наборов данных.
Функция возвращает элементы первого вектора, которые отсутствуют во втором
содержит имена дескрипторов, которые присутствуют в и отсутствуют в . Аналогично для .
Посмотрим сколько таких дескриптров в каждом случае
Т.е. первый набор данных содержит 923 дескриптора, которые отсутствуют вов втором наборе, а второй — 383, которые отсутствуют в первом.
Поскольку мы используем фрагментные дескрипторы, то их отсутствие фактически означает, что число дескриторов данного вида равно нулю. Следовательно мы должны добавить отсутствующие дескрипторы в каждый набор данных и приравнять все их значения нулю.
Чтобы добавить нулевые значения этим дескрипторам мы вызываем их для соответствующего и присваиваем значение .
Проверям размерность полученных данных
Число колонок (дескрипторов) теперь идентично. Проверим порядок следования дескриптров в каждом наборе, используя следующую конструкцию
Выражение в скобках возвращает вектор логических значений, который содержит в случае если на одинаковых позициях находятся одинаковые значения и в противном случае. Функция возвращает , если все значения логического вектора равны .
Проверим действительно ли имена дескрипторов в обоих data.frames совпадают и мы ничего не упустили. Используем для этого функцию , которая принимает два вектора, и если значение первого вектора присутствует во втором, то для этого элемента возвращается значение . Таким образом выражение записанное ниже можно прочитать как “все ли названия колонок первого набора данных присутствуют во втором наборе”
Аналогично выполняется проверка для второго набора
Две эти проверки можно заменить одной, если предварительно отсортировать имена колонок в обоих наборах почле чего сравнить их
Теперь перед объединением строк обоих data.frames необходимо расположить колонки в одинаковом порядке. Воспользуемся для этого свойством индексов и расположим колонки в в той же последовательности что и в
Теперь колонки расположены в одной последовательности. Проверим
Полученные data.frames теперь можно объединить в один с использованием функции — объединение данных по строкам (row bind).
Аналогично когда надо объединить данные по колонкам используется функция .
Загрузим и объединим значения свойства для двух наборов данных
Посмотрим на распределение значений свойства