外注した際にファイル名は必ず 接頭の数字 + アンダースコア + ラベル の形式(例:2025_ITS5.ab1)で数字の部分(例:1902, 1903)ごとにフォルダにまとめたい
1902\
├── ITS\
│ ├── 1902_ITS5.ab1
│ └── 1902_ITS4.ab1
├── BT\
│ └── 1902_BT2A.ab1
└── CAL\
└── 1902_CF1.ab1
1903\
└── CAL\
└── 1903_CMD6.ab1
① フォルダの作成から移動(重複なしで一括作成)
powershell
param (
[string]$RuleFile = ""
)
# ルールを格納するハッシュテーブル
$ruleMap = @{}
if ($RuleFile -and (Test-Path $RuleFile)) {
Write-Host "📄 外部ルールファイル '$RuleFile' を読み込み中..."
$rules = Import-Csv -Path $RuleFile
foreach ($rule in $rules) {
$ruleMap[$rule.Marker.ToUpper()] = $rule.Category
}
} else {
Write-Host "📦 内蔵ルールを使用します"
# 内蔵デフォルトルール
$ruleMap["ITS5"] = "ITS"
$ruleMap["ITS4"] = "ITS"
$ruleMap["ITS3"] = "ITS"
$ruleMap["ITS2"] = "ITS"
$ruleMap["BT2A"] = "BT"
$ruleMap["BT2B"] = "BT"
$ruleMap["CF1"] = "CAL"
$ruleMap["CF4"] = "CAL"
$ruleMap["CMD5"] = "CAL"
$ruleMap["CMD6"] = "CAL"
}
# 📁ファイルを処理
Get-ChildItem -Filter *.ab1 | ForEach-Object {
$file = $_
$nameParts = $file.BaseName -split "_"
if ($nameParts.Length -lt 2) { return }
$prefix = $nameParts[0]
$marker = $nameParts[1].ToUpper()
if ($ruleMap.ContainsKey($marker)) {
$category = $ruleMap[$marker]
$destDir = ".\$prefix\$category"
if (!(Test-Path $destDir)) {
New-Item -Path $destDir -ItemType Directory -Force | Out-Null
}
Move-Item -Path $file.FullName -Destination $destDir
}
}
② 🔄 拡張の余地、プライマーに対する振り分けフォルダを独自に作成して指定も可能
rules.csv
Marker,Category
NS1,rDNA
NS2,rDNA
NS3,rDNA
NS4,rDNA
NS5,rDNA
NS6,rDNA
NS7,rDNA
NS8,rDNA
V9G,rDNA
ITS5,rDNA
ITS4,rDNA
LR0R,rDNA
LR3,rDNA
LR5,rDNA
LR6,rDNA
LR7,rDNA
nu-LSU-896-5,rDNA
BT2A,BT
BT2B,BT
CF1,CF
CF4,CF
CMD5,CAL
CMD6,CAL
RPB1-Af,RPB1
RPB1-Cr,RPB1
fRPB2-5F,RPB2
fRPB2-7cR,RPB2
mrSSU1,mtSSU
mrSSU2,mtSSU
mrSSU2R,mtSSU
mrSSU-1_2-5-mpn,mtSSU
mrSSU-2_3-3-mpn,mtSSU
mrSSU3R,mtSSU
③ 使い方
デフォルトの内蔵ルールを使う(指定なし)
.\分類スクリプト.ps1
外部ルールファイルを使う(柔軟な運用)
.\分類スクリプト.ps1 -RuleFile ".\rules.csv"