1

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のようなものを使用して回答を受け付けています。

ありがとう!

4

3 に答える 3

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)))))

また、「a、b」だけでなく「b、a」もリストしたくないと想定しています。

編集:これらの種類の式は、非常に大きなデータセットでは非常に非効率になる可能性があるため、数百行以下を処理する場合にのみ使用することを検討してください.

于 2012-05-25T03:28:23.913 に答える
1

上記の質問に のタグを付けたのでVBA、ここに vba ソリューションがあります。

これにより、上記の例にあるはずの 45 の一意の組み合わせがすべて得られます。

私の仮定

1)データは Sheet1 の列 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

ここに画像の説明を入力

ファローアップ

これが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

残りは同じだと思います。テストして、エラーが発生した場合はお知らせください。

于 2012-05-24T13:10:59.867 に答える
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
于 2012-05-24T12:33:42.537 に答える