![Как разбить число в одной ячейке, в которой нет запятых, и поместить его в несколько строк?](https://rvso.com/image/1452247/%D0%9A%D0%B0%D0%BA%20%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D1%82%D1%8C%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%B2%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D1%8F%D1%87%D0%B5%D0%B9%D0%BA%D0%B5%2C%20%D0%B2%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9%20%D0%BD%D0%B5%D1%82%20%D0%B7%D0%B0%D0%BF%D1%8F%D1%82%D1%8B%D1%85%2C%20%D0%B8%20%D0%BF%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%B5%D0%B3%D0%BE%20%D0%B2%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%3F.png)
Итак, вот что я собираюсь сделать. У меня есть электронная таблица с ячейкой, в которой находится строка чисел (некоторые длиннее других). Мне нужно извлечь каждые восемь чисел и поместить их в отдельные строки.
Вот как выглядит текущая электронная таблица:
IFIELD1 IFIELD2 IFIELD3 IFIELD4 IMAGELIST
05/30/2009 ERMS 100 Day L. C. 0000001200000013
05/30/2009 ESE 20 Day J. R. 0000001400000015
05/30/2009 IHS 100 Day H. W. 00000016
05/30/2009 LMS 100 Day D. E. 0000001700000018
Вот что я хочу получить:
IFIELD1 IFIELD2 IFIELD3 IFIELD4 IMAGELIST
05/30/2009 ERMS 100 Day L. C. 00000012
05/30/2009 ERMS 100 Day L. C. 00000013
05/30/2009 ESE 20 Day J. R. 00000014
05/30/2009 ESE 20 Day J. R. 00000015
05/30/2009 IHS 100 Day H. W. 00000016
05/30/2009 LMS 100 Day D. E. 00000017
05/30/2009 LMS 100 Day D. E. 00000018
Некоторые наборы чисел доходят до 30 или более групп по 8 в строке. С более чем 1000 строк данных для разделения. Есть ли какой-либо тип кода, который поможет сделать этот процесс менее пугающим? В настоящее время я использую Left, mid и right, но мне потребуются годы, чтобы закончить это. Рабочие листы выходят из доступа, поэтому, если есть более простой способ заполнить их там, я открыт для предложений. Конечный продукт должен быть сохранен в CSV. Также мне нужно сохранить все 8 цифр в завершенном продукте перед сохранением в CSV, чтобы я мог создать ссылку на то, где находится это изображение. Спасибо за вашу помощь!
решение1
В Access есть довольно простое решение.
- Создайте таблицу, которая представляет собой всего лишь список чисел:
1, 2, 3, 4, ... n
гдеn
находится наибольшее количество элементов, которые когда-либо будут в вашемIMAGELIST
. Однако сделать ее больше, чем необходимо, не так уж и дорого, так что доведите ее до 50 или около того. - Создайте запрос, который извлекает исходную таблицу и таблицу чисел.без каких-либо соединений. Если бы вы это сделали
SELECT *
сейчас, вы бы получилиn
копии каждой записи в исходной таблице. - Вместо того чтобы вставлять
IMAGELIST
поле, добавьте формулу, которая выполняетMID
функцию вIMAGELIST
поле на основе значения из вашей таблицы чисел. - Фильтр для отображения только тех записей, где формула не возвращает пустую строку. Это будет означать, что запись длиной в
IMAGELIST
24 символа будет отображаться только 3 раза вместоn
раз с кучей пустых записей.
Вот SQL-код для этого запроса:
SELECT Table1.ID, Table1.IFIELD1, Table1.IFIELD2, Table1.IFIELD3, Table1.IFIELD4, Table2.Number, Mid([IMAGELIST],([Number]-1)*8+1,8) AS ImageListParse
FROM Table1, Table2
WHERE Mid([IMAGELIST],([Number]-1)*8+1,8)<>""
ORDER BY Table1.ID, Table2.Number;
В моем быстром макете — Table1
это ваша исходная таблица, Table2
это таблица чисел, Number
это единственное поле Table2
, и это только числа от 1 до n, а поле автонумерации я добавил ID
только Table1
для сортировки.
Все это предполагает, что каждый элемент состоит IMAGELIST
ровно из 8 символов. Если длина различается, этот подход не сработает.
решение2
Это не так уж и сложно сделать с помощью функций листа Excel. Предположим, что ваши данные находятся Sheet1
в заголовках в строке 1. Создайте Sheet2
. Заполните ее следующим образом:
A1
→=Sheet1!A1
- и перетащите вправо, чтобы охватить все столбцы (т.е. через Column
E
, основываясь на вашем примере с пятью столбцами), - или просто скопируйте заголовки из
Sheet1
вSheet2
.
- и перетащите вправо, чтобы охватить все столбцы (т.е. через Column
A2
→=OFFSET(Sheet1!A$1, $F2-1, 0)
- и перетащите вправо, чтобы охватить все столбцыза исключением
IMAGELIST
(т.е. через КолонкуD
). - В какой-то момент вам понадобится
Sheet2
правильно отформатировать столбцы (например, те, которые содержат даты).
- и перетащите вправо, чтобы охватить все столбцыза исключением
E2
→=LEFT($G2, 8)
F2
→2
G2
→=OFFSET(Sheet1!E$1, $F2-1, 0)
- (Это то же самое, что и формулы в столбцах
A
-D
, за исключением ссылкиSheet1
на столбецE
.)
- (Это то же самое, что и формулы в столбцах
H2
→=RIGHT($G2, LEN($G2)-8)
Перетащите/заполните строку 2 в строку 3. Затем измените
F3
к=IF(H2<>"", F2, F2+1)
, иG3
к=IF(H2<>"", H2, OFFSET(Sheet1!E$1, $F3-1, 0))
Теперь перетащите/заполните строку 3 вниз на столько строк, сколько вам нужно, чтобы получить все данные Sheet1
:
Затем скопируйте и вставьте значения и форматы.
Объяснение:
- Столбец
F
указывает, какая строка наSheet1
этотстрока (onSheet2
) извлекает данные из. - Каждый раз, когда мы переходим к новой
Sheet1
строке (т.е. каждый раз, когда ColumnF
увеличивается), ColumnG
получает полную, 8×н-значение длиной в цифруIMAGELIST
изSheet1
. - Значение в столбце
G
разделяется: первые восемь цифр в столбец,E
а остаток в столбецH
. - Пока у нас есть непустой остаток в Column
H
, мы копируем его в ColumnG
и оставляем ColumnF
без изменений (т.е. обращаемся к той же строке вSheet1
). - Когда у нас заканчиваются данные в столбце
H
, это означает, что мы разложили 8×н-значение длинной цифрыIMAGELIST
изSheet1
внстрок наSheet2
, поэтому мы увеличиваем ColumnF
и извлекаем следующееIMAGELIST
значение.
решение3
Для достижения цели вам необходимо сделать два шага:
1. Разбейте числа на разные столбцы, например, в Excel 2010: Данные - текст по столбцам - фиксированная ширина - установите ширину 8, затем нажмите «Готово».
2 Второй шаг — отменить поворот ваших данных. К сожалению, это не так просто, но в Интернете есть много решений, например, это:Можно ли «отменить поворот» или «обратить поворот» в Excel?