我在Google电子表格中有很多行看起来像这样:
a,b,c,d
a,d
c,d
b,d,f
a,b,f,g,h,i
q,b,b
......等等。
我需要一种方法来创建这种格式的相关对的唯一列表:
a,b
a,c
a,d
b,c
b,d
c,d
b,f
d,f
a,f
a,g
a,h
a,i
......等等。
知道我该怎么做吗?我可以使用Google Spreadsheet的脚本语言,Excel 2004的脚本语言或其他类似PHP的方式获得答案。
谢谢!
答案 0 :(得分:3)
不确定这是否满足您的平台要求,但这是一个电子表格公式,可以在Google电子表格中使用(不过任何Excel版本):
=ArrayFormula(SORT(TRANSPOSE(SPLIT(CONCATENATE(REPT(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))&","&TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);","))));(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))<=TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))))*REGEXMATCH(CONCATENATE(","&SUBSTITUTE(A:A;",";",,")&","&CHAR(9));"(,"&UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))&",[^\t]*,"&TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);","))))&",)|(,"&TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);","))))&",[^\t]*,"&UNIQUE(TRANSPOSE(SPLIT(JOIN(",";A:A);",")))&",)"))&CHAR(9));CHAR(9)))))
它还假设您不想列出“b,a”以及“a,b”。
编辑:对于非常大的数据集,这些公式可能非常低效,因此请考虑仅处理几百行或更少的行。
答案 1 :(得分:1)
以下是制作配对的功能:
<?php
function make_pairs($str) {
$chars = explode(',', $str);
for ($i = 0; $i <= count($chars); $i++) {
$f = array_shift($chars);
foreach ($chars as $char)
echo "$f,$char\n";
}
}
make_pairs('a,b,c,d');
结果:
a,b
a,c
a,d
b,c
b,d
c,d
答案 2 :(得分:1)
由于您已使用VBA
标记了上述问题,因此这是一个vba解决方案。
这将为您提供上述示例应具有的所有45种独特组合。
我的假设
1)数据位于Sheet1的Col A
2) Col A没有任何标题
3)要在Col B中生成的输出
4)您正在使用Excel 2007 +
5)由于b,b
,您将q,b,b
视为有效组合。如果没有,则需要添加一个小调整。
Option Explicit
Sub Sample()
Dim ws As Worksheet
Dim lRow As Long, nRow As Long, n As Long
Dim i As Long, j As Long, k As Long
Dim Myar() As String, TempAr() As String
Set ws = Sheet1
lRow = ws.Range("A" & Rows.count).End(xlUp).Row
n = 0: nRow = 1
With ws
For i = 1 To lRow
Myar = Split(.Range("A" & i).Value, ",")
If UBound(Myar) > 1 Then
For j = LBound(Myar) To UBound(Myar)
For k = LBound(Myar) To UBound(Myar)
If j <> k Then
ReDim Preserve TempAr(n)
TempAr(n) = Myar(j) & "," & Myar(k)
n = n + 1
End If
Next k
Next j
Else
ReDim Preserve TempAr(n)
TempAr(n) = .Range("A" & i).Value
n = n + 1
End If
Next i
For i = LBound(TempAr) To UBound(TempAr)
.Range("B" & nRow).Value = TempAr(i)
nRow = nRow + 1
Next i
'~~> Remove duplicates
.Range("$B$1:$B$" & UBound(TempAr) + 1).RemoveDuplicates _
Columns:=1, Header:=xlNo
'~~> Sort data
.Range("$B$1:$B$" & UBound(TempAr) + 1).Sort _
.Range("B1"), xlAscending
Debug.Print "Total Combinations : " & _
Application.WorksheetFunction.CountA(Columns(2))
End With
End Sub
<强>后续强>
不确定这是否适用于Excel 2004但更换行
.Range("$B$1:$B$" & UBound(TempAr) + 1).RemoveDuplicates _
Columns:=1, Header:=xlNo
与
For i = 1 To UBound(TempAr)
If Application.WorksheetFunction.CountIf(.Range("B" & i).Value) > 1 Then
.Range("B" & i).ClearContents
End If
End With
我想,休息仍然是一样的。如果你有任何错误,请测试并告诉我?