Как объединить несколько файлов Excel для Mac с заголовками, которые одинаковы, но не упорядочены

Как объединить несколько файлов Excel для Mac с заголовками, которые одинаковы, но не упорядочены

Я использую Mac. В моих файлах Excel есть заголовки, которые совпадают, но не упорядочены. Все они начинаются с заголовка с именем "query", а затем все смешивается.

Вот несколько примеров заголовков:

  • запрос|email|facebookUrl|twitterUrl|phoneNumber|timestamp|instagramUrl|error|linkedinUrl|youtubeUrl
  • запрос|facebookUrl|linkedinUrl|phoneNumber|timestamp|youtubeUrl|email|error|instagramUrl|twitterUrl
  • запрос|email|facebookUrl|instagramUrl|timestamp|linkedinUrl|youtubeUrl|phoneNumber|twitterUrl|error

Я могу использовать Терминал для объединения всех csv-файлов с cat *.csv >combined.csv. Но это не работает, потому что все заголовки не упорядочены.

Есть идеи, что я могу сделать?

решение1

Вам необходимо использовать инструмент, поддерживающий CSV. Отличный инструмент —Миллер

Если у вас есть в примере эти 3 CSV-файла

#input_01.csv
a,b,c
0,2,5

#input_02.csv
b,a,c
0,2,5

#input_03.csv
b,a
0,2

вы можете бежать mlr --csv unsparsify ./input_0*.csv >./output.csv, чтобы иметь

+---+---+---+
| a | b | c |
+---+---+---+
| 0 | 2 | 5 |
| 2 | 0 | 5 |
| 2 | 0 | - |
+---+---+---+

решение2

Если ваши файлы чудовищного размера, посмотрите на Power Query. Лично у меня сейчас нет навыков работы с ним, чтобы переупорядочить ваши столбцы в определенном порядке, хотя я мог бы переупорядочить их в алфавитном порядке... я думаю). Поэтому я не буду здесь рассказывать о том, как этого добиться, по крайней мере, сегодня.

Он может делать некоторые удивительные вещи (удивительные для того, кто привык быть ограниченным рамками Excel и не имеет достаточного опыта в VBA, чтобы делать что-то большее, чем просто незначительные сложные вещи). Он определенно может сделать эту работу, насколько я знаю, хотя я не думаю, что я смогу сделать это в ближайшее время.

Однако, если файлы не слишком велики по размеру, так чтоОЧЕНЬпростой формульный подход может выполнить работу, не останавливая ваш компьютер или, по крайней мере, Excel, тогда следующий подход действительно очень прост.

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

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

=INDEX($I$1:$O$4,SEQUENCE(ROWS($I$1:$O$4)),MATCH($A$1:$G$1,$I$1:$O$1,0))

(Для формулы я поместил таблицу из 6 столбцов и 4 строк в A:G, затем еще одну в I:O с теми же заголовками, но они имеют смешанный порядок относительно таблицы A:G.)

INDEX()дается таблица, которую вы хотите переупорядочить, в данном случае I1:O4. Чтобы указать ему использовать все строки, мы используем SEQUENCE()с одним параметром (поскольку "rows" или output - это его первый параметр, нам больше ничего не нужно). Этот параметр - количество строк в таблице, которые вам нужно переупорядочить. Использование sequence позволяет вам задать ему либо адрес диапазона, как я сделал, либо именованный диапазон (действительно, зачем его так использовать),ИЛИпросто количество строк. В конце концов, в большинстве таблиц вы получаете это, просто зная правую сторону диапазона, а? Или, может быть, просто вычитаете какое-то значение для строк выше. Только с именованным диапазоном вам действительно нужно что-то делать, кроме как просто сказать что-то вроде "Хм... I1:O4... должно быть 4 строки, поэтому я просто введу 4...".

Последняя часть — это хорошая часть: порядок столбцов. INDEX()позволяет вам переставлять столбцы и/или заставлять их появляться больше одного раза. Если бы вы знали порядок, который вам нужен для всех файлов, вы могли бы просто ввести что-то вроде, {4,2,19,7,...}чтобы сообщить ему, но вы не знаете. Они могут быть в любом порядке и каждый разный.

Но если вы используете MATCH(), вы можете позволить Excel сделать работу за вас для всех различных порядков. Вы говорите MATCH()использовать заголовки для одного файла, любого, неважно, но вы используете порядок заголовков этого файла для ВСЕХ файлов, которые вы открываете и переупорядочиваете. Таким образом, match ищет каждый из них в заголовках текущего файла и передает им порядок, который он находит, а INDEX()затем собирает ваши данные в том же порядке заголовков, что и файл, который вы выбрали в качестве источника порядка.

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

Поскольку вы будете делать это в файле, который можно сохранить после завершения работы (либо скопированный набор, либо оригиналы, так или иначе вы будете работать с файлами, которые можно изменять и сохранять), вам далее нужно выбрать весь вывод, затем скопировать и Paste|Special|Valuesполучить только данные, а не вывод формулы. Затем удалите исходный материал, оставив только таблицу вывода. Сохраните. Переходите к следующему.

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

Думаю, вам не понадобится ширина столбцов, если подумать, поскольку вы, похоже, планируете объединить CSV-файлы... Практически НИКАКОЕ форматирование не будет иметь значения. Тем не менее, если вы используете живые файлы и рассчитываете использовать их в будущем, выполните шаги форматирования до удаления исходных таблиц. Сохраните как файлы Excel, затем копию CSV. Я предполагаю, что, возможно, они уже являются файлами CSV, так что не беспокойтесь ни о чем из этого, но имейте это в виду для других применений подхода.

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

Еще лучше, если вы достаточно хороши в VBA, откройте новый файл, назовите и сохраните его (как файл макроса, например .xlsm), напишите макрос для разбиения файлов в каталоге, добавляя формулу в каждый, изменяя вывод на только данные, удаляя все слева от него, чтобы первой ячейкой вывода была A1, и сохраняя каждый как CSV. Снова сохраните этот новый файл. Затем разверните его и дайте ему поработать.

Связанный контент