Объединение строк


Содержание

Строки в С и С++

Часть первая. Строки в C


Автор: Сергей Аристов

Опубликовано: 28.12.2003
Исправлено: 10.12.2020
Версия текста: 1.0.1

Введение

Исторически работа со строками в языках С и С++ вызывает затруднения у новичков. Как мне кажется, во многом это связано с тем, что в этих языках строки значительно отличается от строк в языках типа Basic и Pascal. Непонимание базовых принципов приводит к тому, что код либо не работает вовсе, либо что еще хуже, работает, но не стабильно или непредсказуемо даже для его авторов. Основой для написания данной статьи по большей части послужили вопросы, часто задаваемые новичками. Надеюсь, хотя бы часть таких вопросов она снимет.

Это первая часть, в которой обсуждаются «традиционные» строки в С. В С++ существуют более удобные механизмы для работы со строковыми данными, эти механизмы рассматриваются во второй части статьи. А зачем вообще обсуждать неудобные С-строки, если есть С++? К сожалению, совсем забыть о строках в стиле С нельзя по двум причинам:

  • существует большое количество библиотек (например, API операционных систем) работающих именно с С-строками
  • строковые классы в С++ все равно основаны на традиционных С-строках, и если мы хотим разобраться в том, как они работают, нам придется понимать их основы.

Строковые литералы

Самая простая строковая сущность (под строковой сущностью я понимаю нечто, с чем можно работать как с привычной строкой) в С — это так называемый «строковый литерал». Он представляет собой последовательность символов, заключенную в двойные кавычки. Пример:

Пока я намеренно игнорирую вопрос о том, что есть строковый литерал с точки зрения компилятора или языка, ограничиваясь только его свойствами с точки зрения программиста.

Основное свойство строкового литерала — простота его использования. Не имея ни малейшего представления о том, чем он является на самом деле, мы можем использовать его практически везде, где от нас ждут строку. Например, в WinAPI-функцию SetWindowText (она задает текст, связанный с окном) нужно передать описатель окна и строку текста. И мы можем вызвать ее очень просто:

Но конечно, строковых литералов, естественно, фиксируемых при создании программы, будет маловато. Хотелось бы иметь возможность использовать переменные, не правда ли?

Строковые переменные

В С отсутствуют встроенные строковые типы в том смысле, в котором они есть в языках типа Basic и Pascal. И присущая этим языкам легкость оперирования строковыми переменными (присвоение, сравнение) в С недоступна. Что же такое строка в С?

Для начала разберемся, что такое строка в жизни. Очевидно, что строка – это последовательность символов . В С – как в жизни. С-строка — это последовательность символов. Как известно, последовательности в С представляются массивами или указателями. Между первыми и вторыми существует связь, однако природа этой связи выходит за рамки данной статьи. Предполагается, что читателю знакомы следующие особенности связи между массивами и указателями:

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

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

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

Итак, тип строк в С – массив. Однако каков тип элементов этого массива? Вообще говоря, возможны варианты. Исторически символ занимает 1 байт, в этом случае он имеет тип char . При этом существуют и другие кодировки, в которых символ представляется, например, двумя байтами. Для работы с такими строками требуются специальные функции.

Слегка отвлечемся от строк и разберем понятие кодировки . По определению, кодировка — это способ представления чего либо, в нашем случае символов. Кодировки символов делятся на однобайтные — каждый символ представлен одним байтом и многобайтные, в которых одному символу соответствует несколько байтов. В свою очередь многобайтные кодировки можно разделить на кодировки с фиксированным количеством байтов — каждому символу соответствует одинаковое количество байтов, и «плавающие», в которых один символ может представляться разным количеством байтов в зависимости от его содержимого. К первым относятся кодировки типа Unicode, в которой каждый символ представлен двумя байтами, ко вторым — UTF-8 и др. Плавающие кодировки — отдельная тема, языки С/С++ не предлагают для них никакой поддержки.

Необходимость в многобайтных кодировках возникла из-за того, что одним стандартным байтом можно представить не так много символов, например восьмибитный байт способен принимать значения от 0 до 255, а значит в такой кодировке не может существовать более 256 различных символов. Учитывая, что, например, в японском языке около двух тысяч иероглифов, 256 символов японцам явно не хватит. Но уже двух восьмибитных байтов хватит для представления 65536 символов — вполне неплохо, хотя и недостаточно для представления всех символов на свете.

Между однобайтными и фиксированными многобайтными строками принципиальной разницы нет. В С/С++ существует специальный тип для многобайтных символов — wchar_t и специальные функции для работы со строками, состоящими из таких символов. Размер wchar_t не фиксирован в стандарте и определяется реализацией компилятора. На многих платформах и компиляторах это два байта, соответствующих кодировке Unicode. Каждой функции, работающей со строками из однобайтных символов, соответствует функция — «побратим», принимающая строки из многобайтных символов. Кроме того, существует специальная форма для записи строковых литералов, в которых символы представлены несколькими байтами: перед кавычками ставится буква L. Т.е., возвращаясь к нашему первому примеру, вызов функции SetWindowText в Unicode-программе будет выглядеть так:

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

ПРЕДУПРЕЖДЕНИЕ

Не забывайте пользоваться правильными функциями!

Очевидно, что последовательность должна быть как-то ограничена, то есть мы должны знать, где она заканчивается. Размер строки можно было бы счесть равным размеру массива… но тогда возникают две проблемы:

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

А значит, нужно поступить как-то по другому. Собственно, у нас есть два варианта – связать со строкой ее размер и где-то хранить его (например, в нулевом элементе массива или специальной переменной), либо ограничить строку (последовательность) специальным символом (элементом последовательности), дойдя до которого мы будем знать, что достигли конца. Именно этот способ и принят в С, причем в качестве терминатора (ограничивающего символа) выбран символ с кодом 0, как наиболее редко встречающийся в строках. То есть в С строка – это массив элементов типа char, ограниченный символом с кодом 0, называемом нуль-терминатором. Напомню, что c массивом элементов типа char связан указатель на char, поэтому С-строка– это еще и указатель типа char* на область памяти, заканчивающуюся символом с кодом 0.

ПРИМЕЧАНИЕ

У такого подхода есть как положительные, так и отрицательные стороны. Но положительных больше. К первым относятся.
1. Натуральное представление строки в том смысле, что начало строки совпадает с началом последовательности символов
2. Неограниченная длина строки — в случае хранения длины строки отдельно длина строки не может превышать значения, максимального для переменной этого типа. Например, при использовании однобайтовых строк и хранении длины строки в первом элементе последовательности (как в Pascal) длина строки не может превышать максимального значения переменной типа char — на многих платформах это 255.
3. «Сдвинув» начало строки вправо, мы все равно получаем абсолютно нормальную строку, заканчивающуюся нулем. Строка, размер которой хранится отдельно, этой особенности лишена.
Недостатки:
1. Для определения длины строки всякий раз необходимо искать ее конец, сравнивая ее символы с нулевым. Чем длиннее строка — тем больше операций. Об этом следует помнить при использовании длины строки, например, в циклах. Если между итерациями строка не изменяется, ее длину следует вычислить заранее, а потом использовать полученное значение.
2. Строки, с которыми используются стандартные функции, не могут содержать в себе нулевые символы. В редких случаях это может доставить неудобство.

Теперь с высоты наших знаний вернемся к строковым литералам. Я думаю, никого не удивит, что их тип – const char*, т.е. указатель на константные символы, а в конце каждого строкового литерала компилятор автоматически подставляет нуль-терминатор.

Символы

Символы сами по себе тоже довольно интересны. Как вы уже знаете, символьная переменная — это переменная типа char, занимающая в памяти 1 байт. В отличие от строк, символ — это встроенный интегральный тип в С/C++, для него допустимы все операции, допустимые для интегральных типов. Существуют символьные литералы, они записываются в одинарных кавычках (прямых апострофах). Пример символьного литерала:

В вышеприведенном примере значением sym является 65 в кодовой таблице ASCII. В этом случае строка sym=’A’ абсолютно эквивалентна строке sym=65. Однако, в целях улучшения портируемости лучше всегда использовать запись в апострофах — рано или поздно программу может потребоваться скомпилировать на платформе, где у символа А другой код.

Для записи символьных литералов типа wchar_t используется запись, аналогичная записи для строковых литералов этого типа:

Существует специальный формат для записи символьных литералов – слеш, за которым идет код символа. Такая форма записи необходима, если мы хотим использовать элемент, не отображающийся в печатный символ, например нуль-терминатор, который представляется так: ’\0’.

ПРИМЕЧАНИЕ

строки (1), (2) и (3) имеют один и тот же эффект. Однако вторая и третья запись считаются нагляднее – мы сразу видим, что работаем именно с символом.

ПРЕДУПРЕЖДЕНИЕ

Не путайте ‘\0’, ‘0’ и “0”. Первое – символьный литерал, соответствующий символу с кодом 0. Второе – такой же литерал, но обозначающий цифру 0, ее код в ASCII-кодировке 48. Третий — это строковый литерал, содержащий два символа, цифру 0 и нуль-терминатор.

Как я уже упоминал тип char – интегральный, а значит для него определены все операции, определенные для интегральных типов, в том числе +, -, *, / и операции сравнения. Хотя не все они имеют смысл для символов (например, я плохо себе представляю смысл перемножения двух символов), однако их использование совершенно «законно» и их результат обычно именно такой, какой ожидался.

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

Операции со строками


Создание строк

Проиллюстрирую создание строк на фрагментах кода с комментариями.

Присваивание строк

Первый и самый очевидный способ присваивания строк – присваивание отдельных символов. Например,

Однако, это совершенно неудобно. Не зная о правильных способах, начинающие программисты часто «выдумывают» свои способы присваивания строк, конечно, неправильные. Приведу несколько примеров:

Эта ошибка относительно безопасна, так как приводит к сбою на этапе компиляции. Есть и гораздо более опасная ошибка.

Этот код откомпилируется, но, возможно, содержит «идеологическую» ошибку. Неправильно полагать, что в str2 теперь содержится копия str1. На самом деле этот указатель указывает не на копию, а на ту же самую строку. При любом изменении содержимого str2 изменяется str1. Однако, если именно это и требуется, то все в порядке.

Еще один вариант присваивания указателей – присваивание их строковым литералам. Как вы помните, тип строкового литерала – const char*, а значит такой код работает:

Опять же следует помнить, что str указывает на строковый литерал, а не на его копию. Но, к сожалению, такой код тоже сработает:

Здесь мы имеем дело с наследством C, в котором отсутствовал const. Поэтому стандарт С++ разрешает такое присваивание. Что может иметь неприятные последствия:

Результат работы такой программы непредсказуем. Компилятор может разместить константы в памяти только для чтения, и попытка их изменить приведет к сбою. Поэтому всегда объявляйте указатели, в которые вы собираетесь записывать адреса строковых литералов как const char*. В этом случае компилятор не позволит модифицировать данные и диагностирует ошибку, что поможет вам исправить логику программы.

Вопросы неправильного и рискованного присваивания строк мы рассмотрели. Пришла пора обсудить правильное присваивание или копирование строк.

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

Функция посимвольно копирует содержимое строки, на которую указывает src в строку, на которую указывает dest и возвращает dest. Так как массив может быть преобразован в указатель, такой вызов функции абсолютно легален:

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

Снизить риск такого развития событий способна функция

Последний параметр – максимальное количество копируемых символов. Таким образом, передавая туда размер приемника, вы гарантируете, что функция никогда не выйдет за пределы выделенной памяти. Однако помните, что если исходная строка будет скопирована не полностью, нуль-терминатор не появится в результирующей строке. Его придется записать самостоятельно.

ПРЕДУПРЕЖДЕНИЕ

Никогда не забывайте контролировать используемую память!

Сравнение строк

Для лексикографического сравнения строк используются функции strcmp и stricmp. Первая сравнивает строки с учетом регистра, вторая – без. Однако, все это относится только к латинице. Если вы хотите сравнивать без учета регистра кириллические строки, придется разобраться с локалями.

Прототипы этих функций таковы:

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

Полагаю, вам не придет в голову сравнивать строки, используя операции ‘ ’.

Длина строки

Для вычисления длины строки используется функция

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

больше подойдет примерно такой код :

Преобразования строк

Зачастую требуется преобразовать число в строку и наоборот. Есть несколько способов сделать это.

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

Во-вторых, можно использовать функции sprintf и sscanf. Например, так:

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

Хотя sprintf и sscanf довольно удобны, у них есть несколько недостатков. Во-первых, они не всегда быстро работают, во-вторых не типобезопасны. Например, если в строке формата вы укажите, что передаете два целых, а вместо этого передадите два double, ошибка обнаружится только при выполнении программы и найти ее причину будет не так-то просто.

В-третьих, доступно целое семейство функций atof, atoi, atol и itoa, ltoa. Все они очень похоже между собой. Функции из первой группы преобразуют строку в число (float, int или long) в зависимости от окончания. Функции из второй группы выполняют обратное преобразование. Должен заметить, что функции из второй группы (равно как и ранее упомянутая stricmp) не входят в стандарт С, однако они весьма удобны и доступны на некоторых платформах.

Прототипы функций из первой группы:

Функции из второй группы могут создавать строковое представление чисел в любой системе (по любому основанию) от 2 до 36. Основание передается в третьем параметре. Чтобы получить строковое представление числа в десятичной системе, передайте 10. Функции возвращают указатель на строку.

, между которыми размещается содержимое. Если вы не добавляете в тег

ПРИМЕЧАНИЕ

При использовании этих функций не забывайте выделять память, достаточную для предоставления строкового предоставления числа. Например, максимальная длина десятичного строкового представления четырехбайтного беззнакового целого числа — 11 байт, включая нуль-терминатор («4294967295»).

Конкатенация (объединение) строк

Сначала простой вопрос – каков результат выполнения следующего кода:

Если ответ – ошибка на этапе компиляции, материал изложенный в статье вы усвоили (или знали это раньше). Если же вы полагаете, что в str3 будет хранится строка «Hello world!», то вероятно, мои предыдущих объяснений оказалось недостаточно. Нельзя складывать указатели (и имена массивов).

Для конкатенации следует использовать функции.

Есть две специальные функции:

Эти функции добавляют к строке, на которую указывает dest, символы из строки source. Первая версия добавляет все символы до нуль-терминатора, вторая – максимум size символов. Результирующая строка завершается нуль-терминатором.

Кроме того, можно воспользоваться общей функцией sprintf так:

Этот вариант удобнее, если нужно объединить более двух строк. Однако к его недостаткам относится типонебезопасность.

Заключение

На этом первая часть, посвященная С-строкам заканчивается. В качестве домашнего задания рекомендую реализовать упоминавшиеся здесь стандартные функции, за исключением sprintf и sscanf самостоятельно. Это нетрудно, и если вы справитесь, значит, вы отлично овладели материалом. Тем не менее, всегда используйте стандартные функции, а не ваши собственные. Это общее правило – реализовать стандартные функции имеет смысл только в качестве учебного задания.

Для использования строковых функций вам потребуется подключить к программе соответствующие стандартные заголовки. Это string.h для всех функций, кроме sprintf и sscanf, определенных в stdio.h и функций преобразования, определенных в stdlib.h.

В С++ вместо вышеупомянутых заголовочных файлов следует подключать cstring, cstdio и cstdlib соответственно.

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

Объединение ячеек и строк в таблице

Обычно таблицы в HTML используют в их привычном виде — т.е. когда количество столбцов одинаково в каждой строке. Но, предположим, необходимо объединить несколько столбцов в один, например, в шапке таблице.

Атрибуты colspan и rowspan для ячеек (td, th)

Для этого в одной из ячеек таблицы необходимо использовать атрибут colspan=»цифра», где цифра показывает, сколько же столбцов мы намерены объединить.

Такая же ситуация с объединением строк — необходимо также использовать атрибут, но rowspan=»цифра». Цифра указывает на количество объединяемых строк.

Например, нам необходимо создать такую таблицу:

Видно, что в этой таблице есть объединение по строкам в самом верху, там, где столбцы «№ п/п» и «Название». Также сразу видно, что объединять нужно 2 строки, поэтому будем использовать атрибут rowspan=»2″.

Также нужно объединить 4 ячейки в одну с текстом «Цена». Такое же объединение по столбцам необходимо в самой нижней правой ячейке. Поэтому в этих 2-х местах в коде будем использовать атрибут colspan=»4″:

Объединение строк в Excel

Во время работы с таблицами Эксель иногда возникает необходимость в изменении их структуры. Одним из наиболее эффективных и полезных способов преобразования конструкции таблиц является процедура объединения строк.

Стоит сразу отметить, что если в объединении участвуют 2 и более ячеек с заполненными данными, то после проведения данной операции в новой объединенном элементе останутся только данные самой верхней левой ячейки, а остальные значения сотрутся. Если нужно сохранить все данные, следует использовать другие функции, о которых также пойдет речь ниже.

Итак, давайте подробно рассмотрим, каким образом можно объединить строки в Microsoft Excel.

Как объединить строки через формат ячеек

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

  1. Для того чтобы выделить нужные элементы, можно пойти несколькими путями:
    • в первом случае наводим курсор мыши на вертикальную вспомогательную область программы с указанием порядковых номеров строк. После того, как курсор изменит свой вид на стрелку вправо, зажимаем левую кнопку мыши и выделяем все строки, которые будет участвовать в объединении. Убедиться в том, что все сделано правильно можно следующим образом – нужные строки будут визуально выделены.
    • есть и другой способ. В области координатной панели после наведения курсора на номер начальной строчки, которая подлежит слиянию, щелкаем по ней левой кнопкой мыши. Далее зажимаем клавишу Shift и щелкаем по последней строке. Эта последовательность действий поможет выделить область, расположенную между начальным и конечным строками включительно.
  2. Когда необходимая область ячеек выделена, приступаем к операции по объединению. Просто нажимаем правой кнопкой мыши по любому месту выделенного диапазона, в появившемся списке выбираем пункт “Формат ячеек…”.
  3. Перед нам появится соответствующее окно, в котором мы переходим во вкладку “Выравнивание”, ставим галочку напротив опции “Объединение ячеек” и подтверждаем действие нажатием кнопки OK.
  4. По окончании выполнения вышеописанных шагов все выделенные нами строки и ячейки в них объединились в одну. Таким образом, мы получили одну большую ячейку.

Другие варианты открытия формата ячеек

  1. Выделяем нужный диапазон, переходим во вкладку “Главная”, находим кнопку, отвечающую за формат (находится в группе под названием «Ячейки»). Нажимаем на нее и в выпадающем списке выбираем строку “Формат ячеек…”.
  2. Перейдя во вкладку “Главная” переводим взгляд в нижнюю правую часть раздела “Выравнивание”. Здесь есть небольшая кнопка со стрелкой, которая направлена вниз и вправо. Нажатие на нее откроет формат ячеек, причем сразу же во вкладке, отвечающей за выравнивание, что, хоть и незначительно, но позволяет сэкономить время.
  3. Кроме этого программа предоставляет возможность перехода в формат ячеек с помощью горячих клавиш. На этот случая предусмотрена своя комбинация “Ctrl+1”, которую можно использовать, после того, как необходимые элементы будут выделены. Стоит отметить, что этот прием перебрасывает нас в последнюю посещенную вкладку формата ячеек.

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

Объединение строк с использованием кнопок на ленте

Процедуру слияния элементов можно произвести с помощью кнопки расположенной прямо на ленте инструментов.

  1. Сначала необходимо выделить нужные объекты. Для этого можно использовать один из тех способов, которые были рассмотрены ранее. Далее переходим в главную вкладку программы, где нас интересует кнопка “Объединить и поместить в центре”, которая находится в группе «Выравнивание».
  2. Нажав на нее, выделенная область будет объединена в новый элемент, после чего все внесенные в него значения будут выравниваться по центру.

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

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

Процедура объединения в границах таблицы

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

Поэтому давайте рассмотрим способы, которые помогут справиться и с такой задачей.

  1. Как всегда, выделяем все табличные элементы для дальнейших манипуляций с ними. Выполнить это действие можно двумя способами:
    • В первом случае необходимо с помощью зажатой левой кнопки мыши обвести весь диапазон элементов, который будет участвовать в слиянии.
    • Второй вариант отлично подойдет для объединения в один блок большого массива объектов. Требуется нажать на верхнюю левую ячейку объединяемой области, далее зажать Shift и кликнуть по правой нижней ячейке. Допускается выполнение этого действия и в обратном порядке, то есть сначала выбираем нижнюю правую, а потом верхнюю левую ячейкуи
  2. Следующим шагом после выделения будет открытие формата ячеек любым из методов, которые мы разобрали в первой части статьи. Выбираем тот, который понравился больше и реализуем его.
  3. Примечание: Сохранены будут только данные, которые расположены в самой верхней левой ячейке области выделения, о чем нас предупредит программа.

Есть возможность произвести объединение в рамках таблицы с использованием кнопок на ленте инструментов.

  1. Выделяем диапазон одним из двух методов, описанных в предыдущих примерах. Во вкладке “Главная” нажимаем либо на кнопку объединения и одновременного выравнивания по центру, либо нажимаем на треугольную пиктограмму, которая расположена в боковой части кнопки и в выпадающем списке выбираем пункт “Объединить ячейки”.
  2. Процедура объединения будет выполнена на основании выбранного пользователем типа.

Как выполнить объединение без потери данных

Описанные ранее варианты слияния табличных элементов предусматривают удаление всех данных, находящихся в ячейках, за исключением одной. Единственное, что остаётся после этой процедуры – это значение располагающиеся в левой верхней ячейке. Однако, в некоторых случаях необходимо, чтобы после обработки сохранилась вся информация из участвующих в процессе объединения ячеек. Разработчики Эксель предусмотрели это и предоставили пользователю специальную функцию сцепления, с помощью которой ячейки могут объединиться без потери данных.

Основная задача функции состоит в объединении диапазона строк, содержащих данные, в единый элемент. Вот как выглядит формула инструмента, позволяющего это выполнить: =СЦЕПИТЬ(текст_1;текст_2;…)

Аргументом функции может быть либо определенное значение, либо координаты ячейки в таблице. Мы будем пользоваться последним вариантом, поскольку он поможет нам корректно решить поставленную задачу. Максимальное число аргументов функции – 255, что более, чем достаточно.

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

  1. Устанавливаем курсор в ячейку, в которой будут выведен результат после проведения процедуры. Затем нажимаем на кнопку, которая отвечает за вставку функции.
  2. После того, как на экране появится Мастер функций и выбираем из перечня строку «СЦЕПИТЬ», после чего щелкаем OK.
  3. Теперь нужно заполнить аргументы функции. Как уже известно, их максимальное количество – 255, однако, в нашем случае достаточно будет всего 5 (количество строк, которое планируется объединить). В появившемся окне управления аргументами функции кликаем по первому полю, затем – по первой ячейке строки, которая входит в выбранный нами диапазон. Если все сделано правильно, то в первом поле появится координаты выделенной ячейки, а рядом – ее значение. Далее нужно повторить процедуру со всеми остальными ячейками, участвующими в в объединении. После этого нажимаем кнопку «OK».
  4. После повреждения в заданную ячейку будут вставлены все значения выбранных ячеек одной строкой, без переносов и пробелов. Это, конечно же смотрится некрасиво, поэтому нужно все исправить. Для этого необходимо выделить ячейку, в которой находится формула и снова нажать на кнопку «Вставить функцию».
  5. На экране еще раз появится окно настроек аргументов. В каждом из полей после адреса ячейки нужно дописать специальные символы &” “. Но, в последнем поле должен быть указан только адрес. Данные символы являются своеобразным знаком пробела при использовании функции сцепления. Именно по этой причине в последнем поле они не нужны. После того, как все сделано, подтверждаем действие нажатием кнопки OK.
  6. Теперь между значениями вставлены пробелы, как мы и хотели.

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

  1. Для начала нужно написать знак равно (“=”) в ячейке, в которой мы планируем отображать итоговый результат. Далее нажимаем на первую ячейку, расположенную в столбце из выделенного диапазона. Ее адрес должен высветиться в строке формул, а также в ячейке, в которой мы пишем формулу. Теперь пишем специальные символы &” “&.
  2. После этого таким же образом добавляем в формулу остальные ячейки из строк выбранного для объединения столбца. В итоге должна получиться вот такая формула: A2&” “&A3&” “&A4&” “&A5&” “&A6&.
  3. Для того чтобы вывести результат, остается только нажать клавишу Enter. После этого можно заметить, что используя данную формулу, мы добились точно такого же результата, что и в случае с использованием функции сцепления.

Группировка строк

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

  1. Необходимо выделить элементы, участвующие в группировке. При этом указать можно не только именно диапазоны строк, но и отдельные элементы. Затем переходим во вкладку “Данные” и нажимаем кнопку “Группировать”, которая расположена в блоке “Структура”.
  2. В открывшемся окне выбираем вариант группировки. В нашем случае сгруппировать требуется строки, поэтому ставим отметку на соответствующем варианте и подтверждаем действие.
  3. После этого произойдет объединение выделенных строк в группу. Чтобы ее скрыть, нужно кликнуть по пиктограмме, на которой изображен “минус”. Она находится на левой стороне координатной панели.
  4. Если необходимо раскрыть диапазон сгруппированных элементов, то следует просто нажать на значок плюса (+), который отображается там же, где раньше был минус (в случае, если диапазон строк ранее был свернут).

Заключение

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

Объединение текста из двух или нескольких ячеек в одну

В этом курсе:

Данные из нескольких ячеек можно объединить в одну с помощью символа «амперсанд» (&) или функции СЦЕП.

Объединение данных с помощью символа «амперсанд» (&)

Выделите ячейку, в которую вы хотите вставить объединенные данные.

Введите = (знак равенства) и выберите первую ячейку, которую нужно объединить.

Введите символ & и пробел, заключенный в кавычки.

Выберите следующую ячейку, которую нужно объединить, и нажмите клавишу ВВОД. Пример формулы: =A2&» «&B2.

Объединение данных с помощью функции СЦЕП

Выделите ячейку, в которую вы хотите вставить объединенные данные.

Введите выражение = СЦЕП(.

Выберите первую ячейку, которую нужно объединить.

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

Введите закрывающую скобку в конце формулы и нажмите клавишу ВВОД. Пример формулы: =CONCAT(A2, » Семья»).

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community, попросить помощи в сообществе Answers community, а также предложить новую функцию или улучшение на веб-сайте Excel User Voice.

String aggregation in the SQL Server world

На практике, задачи по объединению строк в одну попадаются достаточно часто. Весьма печально, но стандарт T-SQL не предусматривает возможности использовании строковых данных внутри агрегирующей функции SUM:

Msg 8117, Level 16, State 1, Line 1
Operand data type char is invalid for sum operator.

Хотя для решения подобного рода задач, для MySQL была добавлена функция GROUP_CONCAT, а в OracleLISTAGG. В свою же очередь, SQL Server такого встроенного функционала пока не имеет.

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

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

Наиболее очевидным решением данной задачи является применение курсора:

Однако, его использование снижает эффективность выполнения запроса и, как минимум, выглядит не слишком элегантно.

Чтобы избавится от него, можно конкатенировать строки через присваивание переменных:

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

Для агрегации строк также возможно сделать через XML, применяя следующую конструкцию:

Если посмотреть на план, то можно заметить высокую стоимость вызова метода value:

Чтобы избавится от этой операции, можно переписать запрос применяя свойства XQuery:

В результате – получим очень простой и быстрый план выполнения:

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

Более интересна ситуация, когда требуется выполнить конкатенацию сразу по нескольким столбцам. Например, в наличии у нас следующая таблица:

в которой необходимо сгруппировать данные следующим образом:

Как вариант, можно скопировать вызовы XML, но тогда мы получим дублирующие чтения, которые могут существенно повлиять на эффективность выполнения запроса:

В этом можно легко убедится, если взглянуть на план выполнения:

Чтобы сократить повторные чтения можно воспользоваться небольшим XML хаком:

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

Можно воспользоваться курсором:

Однако, как показала практика, при работе с большими ETL пакетами, наиболее производительным решением является возможность присваивания переменных в конструкции UPDATE:

SQL Server не имеет встроенного аналога функций GROUP_CONCAT и LISTAGG. Тем не менее, это не мешает, в зависимости от ситуации, эффективно выполнять задачи по конкатенации строк. Цель данного поста – наглядно это показать.

BestProg

Работа со строками. Класс string . Конструкторы класса. Функции assign() , append() , insert() , replace() , erase() , find() , rfind() , compare() , c_str() . Примеры

Содержание

1. Какое назначение класса string в программах на C++?

Класс string предназначен для работы со строками типа char* , которые представляют собой строку с завершающим нулем. Класс string был введенн как альтернативный вариант для работы со строками типа char* . Строки, которые завершаются символом ‘\0’ еще называются C-строками. Поскольку, string есть классом, то можно объявлять объекты этого класса.

2. Какие модули (библиотеки) нужно подключить, чтобы использовать возможности класса string в MS Visual Studio C++?

Чтобы использовать возможности класса string в MS Visual Studio (C++), нужно подключить библиотеку и пространство имен std .

3. Каким образом осуществляется объявление переменной типа string ? Примеры

Объявление переменной типа string осуществляется точно так же как и обычной переменной. Возможный вариант объявления с одновременной инициализацией.

4. Какие преимущества и недостатки дает использование класса string в сравнении с типом char* ?

Создание нового типа string было обусловлено недостатками работы с строками символов, который демонстрировал тип char* . В сравнении с типом char* тип string имеет следующие основные преимущества:

  • возможность обработки строк стандартными операторами C++ ( = , + , = = , <> и т.п.). Как известно, при использовании типа char* даже наиболее простые операции со строками выглядели сложно и требовали написания чрезмерного программного кода;
  • обеспечение лучшей надежности (безопасности) программного кода. Например, при копировании строк, тип string обеспечивает соответствующие действия, которые могут возникнуть в случае, если строка-источник имеет больший размер чем строка-приемник;
  • обеспечение строки, как самостоятельного типа данных. Объявление типа string как строки есть единым для всех переменных в программе, которая обеспечивает непротиворечивость данных.

Основным недостатком типа string в сравнении с типом char* , есть замедленная скорость обработки данных. Это связано с тем, что тип string – это, фактически, контейнерный класс. А работа с классом требует дополнительной реализации программного кода, который, в свою очередь занимает лишнее время.

5. Какие операторы можно использовать с объектами класса string ?

Класс string есть удобен тем, что позволяет удобно манипулировать строками, используя стандартные (перегруженные) операторы.

С объектами класса string можно использовать нижеследующие операторы

  • = – присваивание
  • + – конкатенация (объединение строк)
  • += – присваивание с конкатенацией
  • == – равенство
  • != – неравенство
  • – меньше
  • – меньше или равно
  • > – больше
  • >= – больше или равно
  • [ ] – индексация

Пример, который демонстрирует использование вышеприведенных операторов

6. Содержит ли класс string конструкторы?

Как и любой класс, класс string имеет ряд конструкторов. Основные из них следующие:

7. Примеры инициализации с помощью конструкторов

Ниже приведены примеры инициализации переменных типа string

8. Присваивание строк. Функция assign() . Примеры

Чтобы присвоить одну строку другой, можно применить один из двух методов:

  • использовать оператор присваивания ‘=’ ;
  • использовать функцию assign() из класса string .

Функция assign() имеет несколько перегруженных реализаций.

Первый вариант – это вызов функции без параметров

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

Второй вариант позволяет копировать заданное количество символов из строки:

  • s – объект, из которого берется исходная строка;
  • st – индекс (позиция) в строке, из которой начинается копирование num символов;
  • num – количество символов, которые нужно скопировать из позиции st ;
  • size_type – порядковый тип данных.

Третий вариант функции assign() копирует в вызывающий объект первые num символов строки s :

  • s – строка, которая завершается символом ‘\0’ ;
  • num – количество символов, которые копируются в вызывающий объект. Копируются первые num символов из строки s .

Ниже приведен пример с разными реализациями функции assign() .

Пример.

9. Объединение строк. Функция append() . Пример

Для объединения строк используется функция append() . Для добавления строк также можно использовать операцию ‘+’ , например:

Однако, функция append() хорошо подходит, если нужно добавлять часть строки.

Функция имеет следующие варианты реализации:

В первом варианте реализации функция получает ссылку на строчный объект s , который добавляется к вызывающему объекту. Во втором варианте реализации функция получает указатель на строку типа const char * , которая завершается символом ‘\0’ .

Пример. Демонстрация работы функции append() .

10. Вставка символов в строке. Функция insert() . Пример

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


Первый вариант функции позволяет вставить полностью всю строку s в заданную позицию start вызывающей строки (вызывающего объекта):

Второй вариант функции позволяет вставить часть (параметры insStart , num ) строки s в заданную позицию start вызывающей строки:

В вышеприведенных функциях:

  • s – строка, которая вставляется в вызывающую строку;
  • start – позиция в вызывающей строке, из которой осуществляется вставка строки s ;
  • insStart – позиция в строке s , из которой происходит вставка;
  • num – количество символов в строке s , которые вставляются с позиции insStart .
11. Замена символов в строке. Функция replace() . Пример

Функция replace() выполняет замену символов в вызывающей строке. Функция имеет следующие варианты реализации:

В первом варианте реализации вызывающая строка заменяется строкой s . Есть возможность задать позицию ( start ) и количество символов ( num ) в вызывающей строке, которые нужно заменить строкой s .

Второй вариант функции replace() отличается от первого тем, что позволяет заменять вызывающую строку только частью строки s . В этом случае задаются два дополнительных параметра: позиция replStart и количество символов в строке s , которые образуют подстроку, которая заменяет вызывающую строку.

Пример. Демонстрация работы функции replace() .

12. Удаление заданного количества символов из строки. Функция erase() . Пример

Для удаления символов из вызывающей строки используется функция erase() :

  • index – индекс (позиция), начиная из которой нужно удалить символы в вызывающей строке;
  • num – количество символов, которые удаляются.

Пример.

13. Поиск символа в строке. Функции find() и rfind() . Примеры

В классе string поиск строки в подстроке можно делать двумя способами, которые отличаются направлением поиска:

  • путем просмотра строки от начала до конца с помощью функции find() ;
  • путем просмотра строки от конца к началу функцией rfind() .

Прототип функции find() имеет вид:

  • s – подстрока, которая ищется в строке, что вызывает данную функцию. Функция осуществляет поиск первого вхождения строки s . Если подстрока s найдена в строке, что вызвала данную функцию, тогда возвращается позиция первого вхождения. В противном случае возвращается -1;
  • start – позиция, из которой осуществляется поиск.

Прототип функции rfind() имеет вид:

  • s – подстрока, которая ищется в вызывающей строке. Поиск подстроки в строке осуществляется от конца к началу. Если подстрока s найдена в вызывающей строке, то функция возвращает позицию первого вхождения. В противном случае функция возвращает -1;
  • npos – позиция последнего символа вызывающей строки;
  • start – позиция, из которой осуществляется поиск.

Пример 1. Фрагмент кода, который демонстрирует результат работы функции find()

Пример 2. Демонстрация работы функции rfind() .

14. Сравнение частей строк. Функция compare() . Пример

Поскольку тип string есть классом, то, чтобы сравнить две строки между собой можно использовать операцию ‘= =’ . Если две строки одинаковы, то результат сравнения будет true . В противном случае, результат сравнения будет false .

Но если нужно сравнить часть одной строки с другой, то для этого предусмотрена функция compare() .

Прототип функции compare() :

  • s – строка, которая сравнивается с вызывающей строкой;
  • start – позиция (индекс) в строке s , из которой начинается просмотр символов строки для сравнения;
  • num – количество символов в строке s , которые сравниваются с вызывающей строкой.

Функция работает следующим образом. Если вызывающая строка меньше строки s , то функция возвращает -1 (отрицательное значение). Если вызывающая строка больше строки s , функция возвращает 1 (положительное значение). Если две строки равны, функция возвращает 0.

Пример. Демонстрация работы функции compare() :

15. Получение строки с символом конца строки ‘\0’ ( char * ). Функция c_str() . Пример

Чтобы получить строку, которая заканчивается символом ‘\0’ используется функция c_str() .

Функция объявлена с модификатором const . Это означает, что функция не может изменять вызывающий объект (строку).

Пример 1. Преобразование типа string в const char * .

Пример 2.

Ниже продемонстрирован перевод строки из string в тип System::String для отображения его в элементе управления типа Label для приложений типа Windows Forms Application .

16. Как определить длину строки типа string ? Функция length()

Для определения количества символов в строке используется функция length() без параметров.

Объединение строк (и чисел) в функции шаблона

Я пытаюсь написать функцию, которая принимает различные строки или числа (которые работают с std::to_string и объединить их. У меня это работает только со строками, но у меня возникают проблемы со специализацией в зависимости от ввода в виде строки или числа.

Мой код называется так:

stringer(«hello», «world», 2, 15, 0.2014, «goodbye», «world»)

И вот что я получил:

В настоящее время он разбивается на более чем одну добавленную строку, если только ниже не указаны все числа (из-за строки to_string). Как я могу специализироваться на основе строки или числа, чтобы вышеуказанное работало? Благодарю.

Решение

Другие решения

Почему бы не использовать простой std :: stringstream?

Еще три способа сделать это:

  1. Похож на хуршидский, но без ненужного массива
  2. Похож на Simple и Khurshid, но основывается на старых компиляторах
  3. Рекурентный путь

По запросу, вот (более длинное) решение с SFINAE:

Обратите внимание, что предполагается, что для данного типа используется либо конкатенация строк (с + ) или же to_string() определяется, но не оба. Так std::string , const char* и любой сторонний класс строк, который естественным образом взаимодействует с std::string должен пройти через + версия. Конечно, если сторонний класс строк делает что-то глупое, например, определение конкатенации и to_string() это будет неоднозначно; вам нужно будет определить has_string_concat а также has_to_string Предикаты типа имеют контроль над разрешением неоднозначности.

Я также помещаю все в пространство имен, чтобы иметь возможность использовать аргумент-зависимый поиск, чтобы выбрать правильную версию to_string ; полный пример показывает пользовательский тип со своим собственным to_string() ,

В C ++ 11 работа с использованием шаблонов с переменными шаблонами работает для меня. Он также заставляет пользователя предоставлять хотя бы один аргумент. inline полезно, если вы определяете функции в заголовочном файле.

Урок по HTML. Объединение ячеек

Таблицы в HTML — весьма удобный элемент. С ними можно делать что угодно. Разумеется, основное назначение — размещение информации в виде таблицы. Но разработчики сайтов пошли дальше. Одно время очень популярно было использовать таблицы для создания каркаса сайта. Сейчас профессионалы стараются так не делать.

Таблицы нашли свое широкое применение из-за большого количества атрибутов. Например, очень полезным оказалось свойство объединения строк или столбцов.

Введение в теорию

В HTML объединение ячеек происходит при помощи двух атрибутов: colspan и rowspan. Они указываются для тега td.

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

На рисунке выше указано две строки, и в каждой по три ячейки. Это является обычной таблицей. Если вы в какой-нибудь строке укажите меньшее количество ячеек, то таблица «съедет», всё будет отображаться некорректно.

HTML-таблица: объединение ячеек по вертикали и горизонтали

Указывать меньшее количество ячеек или строк можно только в том случае, если вы что-то объединяете. Но вместо удаленного элемента в ближайшем соседнем к началу нужно указать дополнительный атрибут. Если объединяете столбцы, то colspan, если строки, то rowspan. В значении атрибута указывается количество элементов, которые нужно объединить.

Обратите внимание, что указывать нужно именно в ближайшем элементе к началу. Например, на рисунке выше, если бы вы хотели объединить ячейку 1 и 2, нужно указать в ячейке 1 атрибут colspan со значением два. И удалить ячейку номер 2 или 3, уже не важно.

Суть заключается в том, что вы указываете ячейке, сколько пространства она займет. По умолчанию значение составляет 1.

Объединение ячеек по вертикали HTML-таблицы происходит по такому же принципу. Просто занимаемое пространство будет считаться по вертикали. Смотрим рисунок ниже.

Здесь ячейка с цифрой 43 занимает две строки. Для этого указали атрибут rowspan. Запоминается просто:

  • Row — строка.
  • Col — колонка/столбец.
  • Span — объединение.

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

В HTML объединение ячеек можно делать сразу в двух направлениях: по вертикали и горизонтали. Для этого указываем одновременно оба атрибута.

На рисунке выше как раз это и указано, что можно делать объединение: строк, столбцов и одновременно столбцов и строк.

HTML: объединение ячеек. Примеры

Рассмотрим более сложные поэтапные примеры в больших таблицах. Ниже на рисунке слева указан исходный вариант обычной таблицы. А справа — вариант с объединением двух ячеек во второй строке. Так нагляднее и проще сравнивать HTML-код.

Так же можно объединить три ячейки в центре. В первом случае атрибут colspan указывали в ячейке №1. Здесь первая будет без изменений, а во второй

добавлен colspan, равный трем.

Если же вы хотите объединить все ячейке в строке до единой, то удаляем четыре td и в первой указываем colspan=’5′.

Как видите, на деле всё это просто. Сложного ничего нет. Главное, внимательно, с первого раза, разобраться во всех подводных камнях таблиц, и потом никаких проблем возникать не должно.

Таблицы как каркас сайта

В HTML объединение ячеек не всегда используется для обычных таблиц с информацией (как в Word или Excel). Разработчики сайтов часто, а раньше поголовно использовали их для верстки сайтов.

Например, можно рассмотреть этот макет сайта. Данный дизайн — очень простой и примитивный. Но здесь можно показать использование объединения явным образом.

Здесь изначально была таблица из трех строк, по две ячейки в каждой. Затем, чтобы разместить логотип сайта, две ячейки в первой строке были объединены. В нижней строке сделали то же самое, чтобы разместить «подвал».

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

Заключение

И помните, что в HTML table объединение ячеек можно делать как угодно. Всё зависит от того, что вам надо, и как вы хотите это оформить. Главное, не запутайтесь. Если хотите создать большую таблицу с большим количеством объединений, то рекомендуется предварительно нарисовать всё это на листочке или в Paint. Начинающим верстальщикам так будет проще.

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

Объединение строк, столбцов и ячеек в Excel. Объединение строк в Microsoft Excel

Весьма удобный элемент. С ними можно делать что угодно. Разумеется, основное назначение — размещение информации в виде таблицы. Но разработчики сайтов пошли дальше. Одно время очень популярно было использовать таблицы для создания каркаса сайта. Сейчас профессионалы стараются так не делать.

Таблицы нашли свое широкое применение из-за большого количества атрибутов. Например, очень полезным оказалось свойство объединения строк или столбцов.

Введение в теорию

В HTML объединение ячеек происходит при помощи двух атрибутов: colspan и rowspan. Они указываются для тега td.

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

На рисунке выше указано две строки, и в каждой по три ячейки. Это является обычной таблицей. Если вы в какой-нибудь строке укажите меньшее количество ячеек, то таблица «съедет», всё будет отображаться некорректно.

HTML-таблица: объединение ячеек по вертикали и горизонтали

Указывать меньшее количество ячеек или строк можно только в том случае, если вы что-то объединяете. Но вместо удаленного элемента в ближайшем соседнем к началу нужно указать дополнительный атрибут. Если объединяете столбцы, то colspan, если строки, то rowspan. В значении атрибута указывается количество элементов, которые нужно объединить.

Обратите внимание, что указывать нужно именно в ближайшем элементе к началу. Например, на рисунке выше, если бы вы хотели объединить ячейку 1 и 2, нужно указать в ячейке 1 атрибут colspan со значением два. И удалить ячейку номер 2 или 3, уже не важно.

Суть заключается в том, что вы указываете ячейке, сколько пространства она займет. По умолчанию значение составляет 1.

Объединение ячеек по вертикали HTML-таблицы происходит по такому же принципу. Просто занимаемое пространство будет считаться по вертикали. Смотрим рисунок ниже.

Здесь ячейка с цифрой 43 занимает две строки. Для этого указали атрибут rowspan. Запоминается просто:

  • Row — строка.
  • Col — колонка/столбец.
  • Span — объединение.

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

В HTML объединение ячеек можно делать сразу в двух направлениях: по вертикали и горизонтали. Для этого указываем одновременно оба атрибута.

На рисунке выше как раз это и указано, что можно делать объединение: строк, столбцов и одновременно столбцов и строк.

HTML: объединение ячеек. Примеры

Рассмотрим более сложные поэтапные примеры в больших таблицах. Ниже на рисунке слева указан исходный вариант обычной таблицы. А справа — вариант с объединением двух ячеек во второй строке. Так нагляднее и проще сравнивать HTML-код.

Так же можно объединить три ячейки в центре. В первом случае атрибут colspan указывали в ячейке №1. Здесь первая будет без изменений, а во второй добавлен colspan, равный трем.

Если же вы хотите объединить все ячейке в строке до единой, то удаляем четыре td и в первой указываем colspan=»5″.

Как видите, на деле всё это просто. Сложного ничего нет. Главное, внимательно, с первого раза, разобраться во всех подводных камнях таблиц, и потом никаких проблем возникать не должно.

Таблицы как каркас сайта

В HTML объединение ячеек не всегда используется для обычных таблиц с информацией (как в Word или Excel). Разработчики сайтов часто, а раньше поголовно использовали их для верстки сайтов.

Например, можно рассмотреть этот макет сайта. Данный дизайн — очень простой и примитивный. Но здесь можно показать использование объединения явным образом.

Здесь изначально была таблица из трех строк, по две ячейки в каждой. Затем, чтобы разместить логотип сайта, две ячейки в первой строке были объединены. В нижней строке сделали то же самое, чтобы разместить «подвал».

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

Заключение

И помните, что в HTML table объединение ячеек можно делать как угодно. Всё зависит от того, что вам надо, и как вы хотите это оформить. Главное, не запутайтесь. Если хотите создать большую таблицу с большим количеством объединений, то рекомендуется предварительно нарисовать всё это на листочке или в Paint. Начинающим верстальщикам так будет проще.

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

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

Пример объединения разряда с одним заголовком «Разряд» и разными данными

Как объединить ячейки в excel

Для объединения ячеек можно воспользоваться двумя способами. Первый — это при помощи контекстного меню через формат. Выделите все ячейки, которые вы хотите обхединить и нажмите на выделенной области правой кнопкой мыши. В выпадающем контекстном меню выберите пункт «Формат ячеек…».

В окне формата перейдите на вкладку «Выравнивание» и в блоке отображение отметьте галочкой пункт «объединение ячеек».

Отметьте пункт «объединение ячеек» во вкладке «Выравнивание»

Если в ячейках присутствуют какие либо данные, Excel выдает каждый раз предупреждение о потери всех данных кроме верхней левой. Поэтому будьте осторожны при объединении и не потеряйте важные данные. Если все же вам необходимо объединить ячейки с данными, соглашайтесь нажав «Ок».

В моем случае из 10 чисел в ячейках в области объединения осталось только число «1» из левой верхней ячейки.

По умолчанию эксел после объединения выравнивает данные по правому краю. Если вам необходимо быстро объединить и при этом сразу же выровнять данные по центру, можно воспользоваться вторым способом.

Так же как и в предыдущем методе выделите ячейки, которые необходимо объединить. В верхней части программы во вкладке «ГЛАВНАЯ» найдите блок, который называется выравнивание. В этом блоке есть выпадающий список, который позволяет объединять ячейки. Для объединения есть три типа:

  1. Объединить и поместить в центре — результатом нажатия на этот пункт будет точно такое же объединение как и в предыдущем примере, но Excel отформатирует выравнивание результирующие данные по центру.
  2. Объединить по строкам — если выделена область ячеек с несколькими строками, программа объединит построчно и в случае, если присутствуют данные, оставит только те, которые находились в левых.
  3. Объединить ячейки — этот пункт действует точно так же как и в первом варианте через формат.
  4. Отменить объединение — вам необходимо выделить ячейку, которая ранее была объединена и нажать на пункт меню — программа восстановит структуру ячеек как до объединения. Данные до объединения естественно не восстановит.

Попробовав любой из способов, вы будете знать как объединить ячейки в экселе.

Второй способ быстрого объединения ячеек

Структура документа Excel строго определена и чтобы не было проблем и ошибок в дальнейшем с вычислениями и формулами, в программе каждому блоку данных (ячейке) должен соответствовать уникальный «адрес». Адрес — это буквенно-числовое обозначение пересечения столбца и строки. Соответственно одному столбцу должно соответствовать только ода ячейка строки. Соответственно разделить ранее созданную ячейку на две не получится. Чтобы иметь разделенную на две ячейку необходимо заранее продумать структуру таблицы. В том столбце, где необходимо разделение необходимо запланировать два столбца и объединить все ячейки с данными, где нет разделения. В таблице это выглядит следующим образом.

Разделить ячейку в экселе на две не возможно. Можно только запланировать структуру таблицы при создании.

В строке 4 у меня присутствует разделенная на две ячейка. Для этого я для столбца «Разряд» запланировал заранее два столбца «B» и «С». Затем в строках, где мне не надо разделение я объединил построчно ячейки, а в строке 4 оставил без объединения. В результате таблица содержит столбец «Раздел» с разделенной на две ячейкой в 4-й строке. С таким способом создания разделения каждая ячейка имеет свой уникальный «Адрес» и к ней можно обращаться в формулах и при адресации.

Теперь вы знаете как разбить ячейку в excel на две и сможете заранее запланировать структуру таблицы чтобы потом не ломать уже созданную таблицу.

Иногда эксель удивляет своими требованиями делать что-то через э… макросы. Вот недавно, встала задача разбить несколько объединенных ячеек по одной, чтобы можно было нормально отсортировать весь диапазон. Думаю, никому не надо объяснять, как просто убрать объединение ячеек, разбив их по одной (я имею ввиду формат-выравнивание-убрать галку с «объединение ячеек»). Но, к сожалению, эксель обладает очень интересным свойством при отмене объединения ячеек не спрашивать, как именно мы хотели бы их вернуть в нормальное, разъединенное состояние, а тупо пишет в верхнюю левую ячейку значение, которое было в объединенной, а все остальные ячейки оставляет незаполненными. Ну, естественно, ни о какой нормальной сортировке по прежде объединенным ячейкам говорить не приходится. И хорошо бы их было всего штук 200-300. А если их шестьдесят тысяч, разбитых на группы по 10 ячеек? Вручную шесть тысяч значений потом копировать в оставшиеся пустыми ячейки?

Типичная картина — хотим отсортировать список пофамильно, чтобы Кузнецов шел все-таки после Иванова. Пример, разумеется, очень упрощенный.

Просто так отсортировать таблицу эксель нам не даст — ячейки-то объеденены. Но и если мы отменим объединение, то каждая фамилия запишется только в верхнюю ячейку, и остальные придется дозаполнять. Получится вот так вот:

А нам то надо, чтобы в каждой ячейке было соответствующее значение, иначе при сортировке получится черти что!

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

  • разгруппировать ячейки выделенного диапазона с заполнением

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

Итак, создаем макрос с кодом:

Sub UnMerge_And_Fill_By_Value() » разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить значениями из их первых ячеек Dim Address As String Dim Cell As Range If TypeName(Selection) <> «Range» Then Exit Sub End If If Selection.Cells.Count = 1 Then Exit Sub End If Application.ScreenUpdating = False For Each Cell In Intersect(Selection, ActiveSheet.UsedRange).Cells If Cell.MergeCells Then Address = Cell.MergeArea.Address Cell.UnMerge Range(Address).Value = Cell.Value End If Next End Sub

If TypeName (Selection) & lt ; & gt ; «Range» Then

If Selection. Cells. Count = 1 Then

Application. ScreenUpdating= False

For EachCellIn Intersect (Selection, ActiveSheet. UsedRange) . Cells

If Cell. MergeCellsThen

Address= Cell. MergeArea. Address

Range (Address) . Value = Cell. Value

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

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

Ну и если, уже после того, как ячейки будут пересортированы, потребуется снова объединить ячейки с одинаковыми значениями (забудем на минуту, что объединенные ячейки — это зло, т.к. в случае, если требуется визуальная наглядность — то без них не обойтись), то нам опять придется использовать макрос. В интернете ссылок куча — но у меня заработал только один .

Тоже на всякий случай приведу код:

Sub MergeCls() Dim ri As Integer, r2 As Integer, Col As Integer r1 = ActiveCell.Row r2 = ActiveCell.Row Col = ActiveCell.Column Do If Cells(r1, Col) <> Cells(r2 + 1, Col) Then If r1 <> r2 Then Range(Cells(r1 + 1, Col), Cells(r2, Col)).ClearContents With Range(Cells(r1, Col), Cells(r2, Col)) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = True End With End If r1 = r2 + 1 End If r2 = r2 + 1 Loop Until Cells(r2, Col) = «» End Sub

DimriAs Integer, r2As Integer, ColAs Integer

r1= ActiveCell. Row

r2= ActiveCell. Row

Col= ActiveCell. Column

If Cells (r1, Col) & lt ; & gt ; Cells (r2+ 1 , Col) Then

Range (Cells (r1+ 1 , Col) , Cells (r2, Col) ) . ClearContents

With Range (Cells (r1, Col) , Cells (r2, Col) )

В офисном пакете MS Excel можно объединить несколько полей, смежных по горизонтали или вертикали в одно большое. Это можно сделать несколькими методами.

Используем контекстное меню

Вызвав правой клавишей мыши контекстное меню, предварительно выделив поля, требующие объединения, следует выбрать Формат .

Нас интересует вкладка Выравнивание .

В свойстве Отображение помечаем галочкой Объединение и нажимаем ОК .

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

Кнопка на ленте для excel 2007 и выше

Для объединения также можно использовать кнопку на ленте.

В версии Office 2013 она располагается на вкладке Главная и выглядит так.

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

Прежде чем нажать эту кнопку следует выделить диапазон вертикальных или горизонтальных ячеек.

В Office 2010 кнопка имеет почти такой же вид с подобным выпадающим списком.

В Office 2003 кнопка объединения с аналогичной функцией находится на панели инструментов Форматирование .

Склеить ячейки можно, используя копипаст , то есть скопировать (Ctrl+C) объединенную, после чего вставить (Ctrl+V) ее в требуемое место.

Используем функцию «СЦЕПИТЬ»

В Excel есть функция Сцепить . Объединяет несколько строк в одну.

В самой функции СЦЕПИТЬ следует через точку с запятой указать нужные нам ячейки или диапазон:

=СЦЕПИТЬ (яч1;яч2;…) от 1 до 255 аргументов функции.

Аналогичную процедуру сцепления можно произвести таким образом:

Пишем макросы

Можно написать простой макрос (либо использовать для этих целей макрорекордер ) и назначить ему некоторое удобное для Вас сочетание горячих клавиш . Возможные варианты кода такого макроса представлены далее.

Второй вариант обеспечит объединение с сохранением исходных данный всех совмещаемых полей.

Выделить необходимые поля и выполнить макрос. Редактор VBA открывается комбинацией Alt+F11 .

Вносим программный код Макроса и выполняем.

Чтобы запустить созданный макрос, нажмите Alt+F8 . Запустится окно Макрос (Macro). В перечне Имя макроса (Macro name) выберите требуемый и нажмите Выполнить (Run).

Как объединить столбцы

В Excel можно объединить значения двух столбцов в один построчно. Например, хотим скомбинировать документ и информацию о нём.

Это можно сделать следующим образом. Выделяем первый столбец, затем на вкладке ГлавнаяРедактирование жмём на поле Найти и выделить , в списке интересующая команда «Выделить группу ячеек… «:

В открывшемся окне ставим галочку – Пустые ячейки , после чего ОК .

В во втором столбце есть пустые столбцы – выделите их.

После знака равно вносим формулу значения соответствующего поля нужного столбца:

После чего Ctrl+Enter и значения вставятся только в пустые ячейки второго столбца.

Как объединить ячейки при помощи горячих клавиш

По умолчанию такого сочетания не существует , однако можно сделать так: выделить требуемые ячейки, объединить кнопкой на ленте.

При любом последующем выделении нажимать F 4 (повтор последней команды!).

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

Как объединить ячейки в HTML-таблице горизонтально

При создании таблиц в HTML иногда необходимо объединить ячейки по горизонтали.

В HTML-таблице каждая ячейка ограничивается набором тегов

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

Для HTML объединения ячеек необходимо добавить в строку меньше ячеек, чем в остальные строки и добавить атрибут colspan=» « внутри тега

ячейки, которую необходимо растянуть.

Рассмотрим простой пример HTML-таблицы с двумя строками и двумя столбцами (четыре ячейки ). Ее HTML-код выглядит следующим образом:

содержимое содержимое
содержимое содержимое
содержимое
содержимое содержимое

Ячейка в верхней строке теперь охватывает два столбца. Поскольку она занимает пространство двух ячеек, в первом ряду есть только один элемент td .

Можно осуществить объединение ячеек таблицы HTML в любой ее области с любым количеством столбцов. Одним из наиболее полезных применений объединения ячеек по горизонтали является создание заголовков таблицы. Если таблица имеет n столбцов, поместите атрибут colspan=»n» в первую ячейку верхнего ряда и удалите другие ячейки из этого ряда.

Как объединить ячейки в HTML-таблице по вертикали: rowspan

Атрибут rowspan=» » позволяет объединять ячейки по вертикали

Если нужно, чтобы ячейка охватывала несколько строк, следует добавить атрибут rowspan=» « внутри тега

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

Рассмотрим простой пример HTML-таблицы с четырьмя ячейками, разделенными на две строки и два столбца. HTML-код :

содержимое содержимое
содержимое содержимое

Чтобы осуществить HTML table объединение ячеек по вертикали, добавьте для первой ячейки верхней строки атрибут rowspan=»2″ , а затем удалите одну из ячеек в нижнем ряду. HTML-код теперь будет выглядеть следующим образом:

stuff содержимое
содержимое

Можно комбинировать горизонтальное и вертикальное объединение ячеек в одной таблице, как показано на рисунке слева. Одна ячейка даже может охватывать несколько строк и столбцов, как показано на рисунке справа. HTML-код для каждой таблицы приведен ниже:

Способы комбинирования rowspan и colspan для создания пользовательских HTML-таблиц с ячейками, которые охватывают несколько строк и столбцов

span 3 rows span 3 columns
H T span 2 rows
M L
span 4 columns
span 2 rows and 2 columns T
A
E L B

Использование вертикально объединенных ячеек

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

Как объединить две строки в C?

Как добавить две строки?

Я пробовал name = «derp» + «herp»; , но получил ошибку:

Выражение должно иметь интегральный или перечисляемый тип

C не поддерживает строки, которые имеют некоторые другие языки. Строка в C — это просто указатель на массив char , который заканчивается первым нулевым символом. В C не существует оператора конкатенации строк.

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

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

Вызвать функцию следующим образом:

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

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

Илон Маск рекомендует:  Asp семейство application staticobjects
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL