Advertisement
  1. Code
  2. Go

Очистка данных с помощью Go: часть 1

by
Read Time:7 minsLanguages:
This post is part of a series called Cleaning Up Your Data With Go.
Cleaning Up Your Data With Go: Part 2

Russian (Pусский) translation by Anna k.Ivanova (you can also view the original English article)

Обзор

Одним из наиболее важных аспектов любого приложения является проверка правильности его ввода. Самый базовый подход просто терпит неудачу, если ввод не удовлетворяет требованиям. Однако во многих случаях этого недостаточно. Во многих системах сбор данных отделен от анализа данных. Это может быть опрос или старый набор данных.

В этих случаях необходимо проанализировать весь набор данных перед анализом, обнаружить недействительные или отсутствующие данные, исправить то, что можно исправить, а также пометить или удалить данные, которые невозможно восстановить. Также полезно предоставить статистику о качестве данных и о том, какие ошибки были обнаружены.

В этой серии из двух частей вы узнаете, как использовать текстовые средства Go, нарезать кубиками файлы CSV, а также убедиться, что ваши данные безупречно чисты. В первой части мы сосредоточимся на основах обработки текста в Go - байтах, рунах и строках - а также на работе с файлами CSV.

Текст в Go

Прежде чем мы углубимся в очистку данных, давайте начнем с основы текста в Go. Строительные блоки - это байты, руны и строки. Давайте посмотрим, что каждый из них представляет и каковы отношения между ними.

Байты

Байты - это 8-битные числа. Каждый байт может представлять одно из возможных 256 значений (от 2 до степени 8). Каждый символ в наборе символов ASCII может быть представлен одним байтом. Но байты не являются символами. Причина в том, что Go как современный язык поддерживает Unicode, где существует более 256 отдельных символов. Появляются руны.

Руны

Руна в Go - это другое имя для типа int32. Это означает, что каждая руна может представлять более четырех миллиардов отдельных значений (от 2 до степени 32), что достаточно для охвата всего набора символов Unicode.

В следующем коде вы можете видеть, что руна '∆' (alt-J на Mac) является просто int32. Чтобы напечатать символ, который он представляет на экране, я должен преобразовать его в строку.

Юникод сложен. Руна официально представляет кодовую точку Unicode. Символы Unicode обычно представлены одной кодовой точкой Unicode, но иногда больше чем одним.

Строки

Строки официально представляют собой только байты, доступные только для чтения. Если вы индексируете строку, вы получаете байт обратно:

Строковые литералы представляют собой последовательность символов UTF-8, заключенную в двойные кавычки. Они могут содержать escape-последовательности, которые являются обратной косой чертой, за которой следует символ ASCII, такой как \n (новая строка) или \t (табуляция). У них есть особые значения. Вот полный список:

Иногда вы можете захотеть хранить буквенные байты непосредственно в строке, независимо от escape-последовательностей. Вы можете избежать каждой обратной косой черты, но это утомительно. Гораздо лучший подход - использовать необработанные строки, заключенные в обратные кавычки.

Вот пример строки с escape-последовательностью \t (tab), которая представляется один раз как есть, затем с обратной косой чертой, а затем в виде необработанной строки:

Хотя строки представляют собой кусочки байтов, когда вы перебираете строку с помощью оператора for-range, вы получаете руну в каждой итерации. Это означает, что вы можете получить один или несколько байтов. Это легко увидеть с помощью индекса для диапазона. Вот безумный пример. Еврейское слово «שלום» означает «Привет» (и мир). Иврит также написано справа налево. Я создам строку, которая смешивает еврейское слово с его английским переводом.

Затем я напечатаю руны за рунами, включая байтовый индекс каждой руны в строке. Как вы увидите, каждая ивритская руна занимает два байта, в то время как английские символы занимают один байт, поэтому общая длина этой строки составляет 16 байтов, даже если она содержит четыре ивритских символа, три символа и пять английских символов (12 символов). ). Также ивритские символы будут отображаться справа налево:

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

При печати строк и байтовых фрагментов есть несколько спецификаторов формата, которые работают одинаково на обоих. Формат %s печатает байты как есть, %x печатает два шестнадцатеричных символа в нижнем регистре на байт, %X печатает два шестнадцатеричных символа в верхнем регистре на байт, а %q печатает строку в двойных кавычках, экранированную с использованием синтаксиса go.

Чтобы избежать знака% внутри спецификатора строки формата, просто удвойте его. Чтобы разделить байты при использовании% x или% X, вы можете добавить пробел, как в «% x» и «% X». Вот демо:

Чтение и запись файлов CSV

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

Вот небольшой фрагмент из набора данных наблюдений НЛО (на самом деле). Первая строка (заголовок) содержит имена столбцов, а другие строки содержат данные. Вы можете видеть, что часто столбец «Представленные цвета» пуст:

Запись этого куска данных CSV в файл включает в себя некоторые строковые операции, а также работу с файлами. Прежде чем мы углубимся в основную логику, вот обязательные части: определение пакета, импорт и строка данных (обратите внимание на использование const).

Функция main() создает файл с именем «ufo-sightings.csv», проверяет, что ошибки нет, а затем создает буферизованную программу записи w. Вызов defer в следующей строке, который сбрасывает содержимое буфера в файл, выполняется в конце функции. В этом смысл отсрочки. Затем он использует функцию Split() пакета strings, чтобы разбить строки данных на отдельные строки.

Затем внутри цикла for начальные и конечные пробелы обрезаются из каждой строки. Пустые строки пропускаются, а непустые строки записываются в буфер, за которым следует символ новой строки. Вот и все. Буфер будет сброшен в файл в конце.

Чтение из файла довольно простое:

Заключение

Go имеет мощные средства для работы с текстом любых форм и кодировок. В этой части серии мы рассмотрели основы представления текста в Go, обработки текста с использованием пакета strings и работы с файлами CSV.

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.