从Google电子表格中的多值组合列表中创建唯一对列表

时间:2012-05-24 12:19:18

标签: php excel vba google-sheets google-apps-script

我在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的方式获得答案。

谢谢!

3 个答案:

答案 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

enter image description here

<强>后续

不确定这是否适用于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

我想,休息仍然是一样的。如果你有任何错误,请测试并告诉我?