У меня есть данные в столбце 1 и данные в столбце 2 следующим образом:

1234      eggs
1234      bacon
1234      toast
4321      Orange Juice

Я хочу, чтобы это выглядело следующим образом:

1234      eggs-bacon-toast
4321      orange juice

Я также хотел бы, чтобы он автоматически удалял дублирующиеся строки, чтобы у меня были уникальные числа в столбце 1 только с объединенными данными.

3 ответа3

0

Вам нужно написать программу или скрипт, чтобы соединить строки общим ключом (столбец 1).

Если вы не знаете VBA, вы можете использовать простой скрипт ruby, чтобы выполнить объединение данных из CSV-экспорта рабочей таблицы.

Следуй этим шагам:

  1. Экспортируйте свой лист в формате CSV.
  2. Затем запустите приведенный ниже скрипт для данных, создав новый выходной файл в формате CSV.
  3. Импортируйте файл CSV-вывода в Excel.

Данные должны выглядеть примерно так:

$ cat joiner-data.csv
Key,Data
"1234",eggs
"1234",bacon
"1234",toast
"4321","Orange Juice"

Ниже приведен скрипт ruby для объединения данных по ключу столбца 1.

Кстати, этот код не заботится о том, являются ли данные ключа числовыми или нет - он объединит данные на основе любого значения ключа.

#!/usr/bin/env ruby
# joiner.rb input >output
# read CSV data, with key in column one
# output each key once, with all associated data joined by '-'

require 'csv'

records = {}

input = ARGV.shift

CSV.foreach(input, :headers => true, :return_headers => false) do |row|
  data = row.fields
  key = data.shift
  records[key] ||= []       # ensure new keys start with an empty array
  records[key] += [data]    # append the record data
end

# output the record keys in ascending order, with the data associated with each key
CSV { |csv| records.keys.sort.each{|k| csv << [k,records[k].join('-')]}}

exit

Вот пример прогона с использованием приведенных выше данных в формате CSV:

$ ./joiner.rb joiner-data.csv
1234,eggs-bacon-toast
4321,Orange Juice

Этот вывод должен быть помещен в файл, который может быть импортирован обратно в Excel. Как это:

$ ./joiner.rb joiner-data.csv >joined-data.csv

Теперь импортируйте файл joined-data.csv .

Надеюсь это поможет.

0

Использование vba, вероятно, является наиболее подходящим решением для этой проблемы, но если вы раньше не использовали язык программирования, вы можете столкнуться с несколькими ошибками и не знать, что делать. То же самое касается решения, которое дает aks, и это решение также требует выхода из excel. При этом полезно знать, как манипулировать csv-файлами вне Excel, и вы сможете получить то, что хотите, если будете следовать инструкциям, которые дает aks.

Если вы просто хотите , решения плагина в воспроизводимом, я сделал таблицу со всеми некоторыми формулами для вас здесь. Чтобы использовать его, вставьте данные в столбцы A и B под метками, опустите формулы в C2-F2, а затем отфильтруйте столбец F по пробелам. Результаты будут в "ФИНАЛЕ А" и "ФИНАЛЕ Б".

0

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

На ленте у вас есть вкладка для разработчиков. Нажмите на это и перейдите к "Visual Basic". Теперь, вверху в редакторе VBA, нажмите insert - module. В модуле вставьте код ниже:

Sub Macro1()
Application.ScreenUpdating = False
'sort columns
    Columns("A:B").Select
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A1:B150440")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Dim c As Range
Dim strValue As String

'only non-blank cells
For Each c In Range("A:A")
    If c <> "" Then
Again:
        'check for matches and combine
        If c.Value = c.Offset(1).Value Then
           strValue = c.Offset(, 1).Value & "-" & c.Offset(1, 1).Value
           c.Offset(, 1) = strValue
           c.Offset(1).EntireRow.Delete
           GoTo Again
        End If
    End If
Next c


Application.ScreenUpdating = True
End Sub

Запустите его, и вам будет хорошо идти.

Я бы порекомендовал сделать копию ваших данных перед запуском макроса и запустить макрос на копии, в случае, если он не делает то, что вы хотите

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .