参考(引用)
https://www.shegolab.jp/entry/windows-cross-join#shegolab-crossjoin-02
https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f
入力ファイルと出力ファイルのエンコーディングは BOM なしの UTF-8 です。
入力ファイルの1行目はヘッダー行とみなし読み飛ばされますので、出力には含まれません。
出力ファイル名はとりあえず [スクリプト名].out.txt の固定で、都度上書きされます。
エクスプローラのファイルパスにpowershell
と入力して実行
【使い方】
フォルダを一つ新規作成して開きます
上記バッチスクリプトを BAT ファイル(.bat)としてそのフォルダに保存します
ファイル名は任意ですが、拡張子(ファイル名の最後)を 「.bat」としてください
組み合わせたいリストをそれぞれテキストファイル(.txt)として同フォルダに保存します
先頭行から1行1項目とします(見出し行なし)
フォルダでコマンドプロンプトを開きます
フォルダウィンドウの上部にあるアドレスバーに cmd と入力してEnterを押すと、フォルダのパスでコマンドプロンプト(文字だけの黒いウィンドウ)を開けます
コマンドプロンプトでバッチファイルを実行します
各ファイルの項目の組み合わせデータがカンマ区切りで出力されます
以下のような使い方を想定しています。
$scriptName = $MyInvocation.MyCommand.Name
if ($args.Count -eq 0) {
echo "Usage: ${scriptName} FILE1 FILE2 ..."
exit
}
$gInputLists = @() #ファイルから読み込まれた複数リストの配列
$gOutputLines = @() # 出力行の配列
function crossjoin {
param($line, $listIdx, $lineNum)
if ($listIdx -gt 0) {
foreach($item in $gInputLists[$listIdx]) {
$lineNum = crossjoin ([string]::concat($line,",",$item)) ($listIdx-1) $lineNum
}
} else {
foreach($item in $gInputLists[$listIdx]) {
$gOutputLines[$lineNum] = [string]::concat($line.substring(1),",",$item)
$lineNum += 1
}
}
$lineNum
}
$gInputLists = foreach($file in $args) {
,(cat $file -Encoding UTF8 | select -Skip 1 )
}
$totalLineCount = $gInputlists|%{$a=1}{$a*=$_.Count}{$a}
$gOutputLines = @("") * $totalLineCount
crossjoin "" ($gInputlists.Count-1) 0 | Out-Null
$result = $gOutputLines -join "`r`n"
[System.IO.File]::WriteAllText(".\${scriptName}.out.txt", $result) # BOMなしUTF-8出力