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

Php 从Google电子表格中的多值组合列表创建唯一对列表,php,excel,vba,google-sheets,google-apps-script,Php,Excel,Vba,Google Sheets,Google Apps Script,我在谷歌电子表格中有一大堆行,看起来是这样的: 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 ……等等 知道我该怎么做吗?我对使用谷歌电子表格的脚本语言、Excel2004的脚本语言或其他类似PHP的语言的答案持开放态度 谢谢 以下是配对功能: <?php function make_pairs($s

我在谷歌电子表格中有一大堆行,看起来是这样的:

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
……等等

知道我该怎么做吗?我对使用谷歌电子表格的脚本语言、Excel2004的脚本语言或其他类似PHP的语言的答案持开放态度


谢谢

以下是配对功能:

<?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');

以下是配对的函数:

<?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');

由于您已将上述问题标记为
VBA
,下面是一个VBA解决方案

这将为您提供上述示例应该具有的所有45种独特组合

我的假设

1)数据在表1的A栏中

2)列A没有任何标题

3)要在列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


其余的我想还是一样。测试它并告诉我是否有任何错误?

由于您已将上述问题标记为
VBA
,下面是一个VBA解决方案

这将为您提供上述示例应该具有的所有45种独特组合

我的假设

1)数据在表1的A栏中

2)列A没有任何标题

3)要在列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


其余的我想还是一样。测试它并告诉我是否有任何错误?

不确定这是否满足您的平台要求,但这里有一个可以在Google电子表格中使用的电子表格公式(但不是在任何Excel版本中):


=ArrayFormula(SORT(排序)(转置)(拆分)(串联)(REPT(UNIQUE)(转置(拆分(JOIN)(,“A:A”);“,”)&“,”和转置(UNIQUE)(转置(拆分(JOIN)(,“A:A”);“,”);(唯一)(转置(拆分(JOIN)(,“A:A”);“,”)))不确定这是否满足您的平台要求,但这里有一个可以在谷歌电子表格中使用的电子表格公式(但不是在任何Excel版本中):


=ArrayFormula(排序(转置)(拆分)(报告(唯一)(转置(拆分(合并)(,“A:A”);“,”)&“,”和转置(唯一)(转置(拆分(合并)(,“A:A”);“,”));(唯一(转置(拆分(合并)(,“A:A”);“,”)))这看起来棒极了,但是你能用什么方法让它与Excel 2004兼容呢?我在Mac上…对不起,我没有Excel 2004。我有Excel 2011。我相信我可能是错的,但所有代码都应该保持不变,接受
.Range($B$1:$B$”&UBound(TempAr)+1).RemovedUpplicates uu列:=1,标题:=xlNo
。相反,您必须循环单元格以删除重复项。谢谢;我在Myar=Split(.Range(“A”&I).Value,”)
——我想2004没有“Split”函数?是的:)看看这是否有帮助?用链接中提到的代码替换那一行。这看起来很棒,但是你可以用任何方式使其与Excel 2004兼容吗?我在Mac上…对不起,我没有Excel 2004。我有Excel 2011。我相信我可能错了,但所有代码都应该保持不变接受
.Range($B$1:$B$”&UBound(TempAr)+1).RemovedUpplicates uu列:=1,标题:=xlNo
。相反,您必须循环单元格以删除重复项。谢谢;我在Myar=Split(.Range(“A”&I).Value,”)
——我想2004没有“Split”函数?是的:)看看这是否有帮助?用链接中提到的代码替换那一行。你可能想在上面的问题中添加你正在使用Excel 2004?是的,对此表示歉意--我没有意识到这两个版本之间存在差异。你可能想在上面的问题中添加你正在使用Excel 2004?是的,对此表示歉意--我没有我不知道这两个版本之间有什么不同。你建立了这个公式吗?因为它既让我惊讶又让我害怕。非常出色的工作-它让谷歌电子表格在我的600行数据集上停滞了整整2分钟,但效果非常好。选择作为答案是因为它工作良好且易于实现。可能说得太快了--我的数据集翻了一倍,似乎已经停止工作了……是的,不幸的是,GSheets中的这些字符串操作公式在使用大数据集时确实会受到性能方面的影响,以至于工作表停止。我很抱歉,我真的应该首先限定我的答案,我会相应地进行编辑。对于大数据设置,我会使用脚本解决方案,所以请随意更改最佳答案。你建立了这个公式吗?因为它让我既惊讶又害怕。非常出色的工作-它让谷歌电子表格在我的600行数据集上停滞了整整2分钟,但效果非常好。选择作为答案是因为它工作良好且易于实现。可能有e说得太早了--我的数据集翻了一倍,它似乎已经停止工作了…是的,不幸的是,GSheets中的这些字符串操作公式在大数据集上确实会受到性能方面的影响,以至于工作表会停止。我道歉,我真的应该首先限定我的答案,我将编辑accord对于大数据集,我会使用脚本解决方案,所以请随意更改最佳答案。
        For i = 1 To UBound(TempAr)
            If Application.WorksheetFunction.CountIf(.Range("B" & i).Value) > 1 Then
                .Range("B" & i).ClearContents
            End If
        End With
=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)))))