db = $db; } /** * 서버 하드웨어 사양 정제 도구 (2025 최적화 버전) */ /** * 1. CPU 사양 정제 (모델명 * 수량) */ function refineCPU(string $raw): string { $raw = strtoupper(trim($raw)); if (empty($raw) || $raw === '0' || $raw === 'NULL') return '0'; // E5504*2 또는 E5504 * 2 형태 처리 if (preg_match('/(.+?)\s*\*\s*(\d+)/', $raw, $matches)) { return trim($matches[1]) . " * " . $matches[2]; } // 단일 모델명인 경우 수량 1 추가 return $raw . " * 1"; } /** * 2. RAM 및 HDD 사양 정제 (용량G * 수량) * HDD의 경우 [타입 용량G * 수량] 패턴 및 콤마 구분 적용 */ function refineSpec(string $raw, bool $isHDD = false): string { $raw = trim($raw); if (empty($raw) || $raw === '0' || strtoupper($raw) === 'NULL') return '0'; // 대문자 변환 및 단위 통일 $raw = strtoupper($raw); $raw = str_replace(['RAM', 'GB'], ['', 'G'], $raw); // 패턴 분석 및 데이터 추출 // 1단계: 괄호 안의 상세 사양 우선 추출 (예: 32G(4G*8) -> 4G*8) if (preg_match('/\(\s*(\d+)\s*G\s*\*\s*(\d+)\s*\)/', $raw, $matches)) { $raw = $matches[1] . "G * " . $matches[2]; } // 2단계: 타입별 분리 및 수량 합산 // HDD 타입들 (SSD, SATA, SAS) $types = ['SSD', 'SATA', 'SAS']; $resultParts = []; if ($isHDD) { foreach ($types as $type) { // 해당 타입이 포함된 문구만 추출 (예: SSD 128G SSD 128G) if (str_contains($raw, $type)) { preg_match_all('/' . $type . '\s*(\d+)\s*G/', $raw, $matches); if (!empty($matches[1])) { $counts = array_count_values($matches[1]); foreach ($counts as $size => $qty) { $resultParts[] = "{$type} {$size}G * {$qty}"; } } } } } else { // RAM 처리 (타입 없이 용량만 추출) preg_match_all('/(\d+)\s*G/', $raw, $matches); if (!empty($matches[1])) { $counts = array_count_values($matches[1]); foreach ($counts as $size => $qty) { $resultParts[] = "{$size}G * {$qty}"; } } } // 3단계: 결과 조립 (HDD는 콤마로 구분) if (empty($resultParts)) { // 매칭되는 패턴이 없을 경우 기본 숫자 추출 시도 if (preg_match('/(\d+)/', $raw, $m)) return $m[1] . "G * 1"; return $raw; } return implode(', ', $resultParts); } /** * 3. [활용 예시] 실 데이터 변환 테스트 */ // $testData = [ // ['cpu' => 'E5504', 'ram' => '4g 4g', 'hdd' => 'SSD 128G SSD 128G SATA 500G SATA 500G'], // ['cpu' => 'E5504*2', 'ram' => '32G(4G*8)', 'hdd' => 'SAS 146G SAS 146G SAS 146G SAS 146G'], // ['cpu' => 'X5570', 'ram' => '16g', 'hdd' => 'SSD 128G * 4'], // ]; // echo "--- 마이그레이션 데이터 변환 결과 ---\n"; // foreach ($testData as $row) { // echo "CPU: " . refineCPU($row['cpu']) . "\n"; // echo "RAM: " . refineSpec($row['ram'], false) . "\n"; // echo "HDD: " . refineSpec($row['hdd'], true) . "\n"; // echo "-------------------------------------\n"; // } /* [출력 예상 결과] CPU: E5504 * 1 RAM: 4G * 2 HDD: SSD 128G * 2, SATA 500G * 2 ------------------------------------- CPU: E5504 * 2 RAM: 4G * 8 HDD: SAS 146G * 4 ------------------------------------- CPU: X5570 * 1 RAM: 16G * 1 HDD: SSD 128G * 4 */ public function process(string $site, array $row, int $cnt): void { //server_use_status => y이면 사용중 $temps = []; $temps['code'] = trim($row['server_code']); $temps['type'] = 'normal'; $temps['chassisinfo_uid'] = 1; $temps['price'] = trim($row['server_use_status']) === 'y' ? 0 : intval($row['server_cost']); $temps['status'] = trim($row['server_use_status']) === 'y' ? STATUS['AVAILABLE'] : STATUS['OCCUPIED']; $temps['manufactur_at'] = trim($row['server_release_date']); if (!$this->db->table('serverinfo')->insert($temps)) { throw new \Exception($this->db->error()['message']); } echo "{$cnt} -> {$temps['code']} SERVERCODE 완료.\n"; } }