我在第 1 列和第 2 列中有数据,如下所示:
1234 eggs
1234 bacon
1234 toast
4321 Orange Juice
我希望它显示如下:
1234 eggs-bacon-toast
4321 orange juice
我还希望它自动删除重复的行,这样我在第 1 列中就有仅包含组合数据的唯一数字。
答案1
您需要编写一个程序或脚本来将各行与通用键(第 1 列)连接起来。
如果您不懂 VBA,那么您可以使用一个简单的 ruby 脚本来连接工作表的 CSV 导出中的数据。
按着这些次序:
- 以 CSV 格式导出您的工作表。
- 然后对数据运行下面的脚本,生成一个新的 CSV 格式的输出文件。
- 将 CSV 输出文件导入 Excel。
数据看起来应该是这样的:
$ cat joiner-data.csv
Key,Data
"1234",eggs
"1234",bacon
"1234",toast
"4321","Orange Juice"
下面是通过第 1 列键连接数据的 ruby 脚本。
顺便说一句,此代码不关心键数据是否为数字——它将根据任何键值连接数据。
#!/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
。
希望这可以帮助。
答案2
使用 vba 可能是解决此问题最合适的方法,但如果您以前没有使用过编程语言,您可能会遇到一些错误并且不知道该怎么做。aks 提供的解决方案也是如此,并且该解决方案也需要退出 excel。话虽如此,知道如何在 excel 之外操作 csv 文件还是不错的,如果您按照 aks 提供的步骤操作,您应该能够得到您想要的东西。
如果你只是想要一个即插即用的解决方案,我为你制作了一个包含所有公式的电子表格这里。要使用它,请将数据粘贴到标签下的 A 列和 B 列中,拉下 C2-F2 中的公式,然后按非空白筛选 F 列。结果将为“FINAL A”和“FINAL B”。
答案3
好吧,这不是很难。首先,显示开发者选项卡单击 Office 按钮,转到 Excel 选项并选择显示开发者选项卡. 这使您可以编辑和运行宏。
在功能区上,您现在有一个开发人员选项卡。单击它并转到“Visual Basic”。现在,在 VBA 编辑器顶部,单击插入-模块. 在模块中粘贴以下代码:
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
运行它然后你就可以开始了。
我建议在运行宏之前复制一份数据,然后在副本上运行宏,以防它没有按照你想要的方式运行