/
UzhvaD
/
Web_application_development_Course_work
Обзор
Документация
Войти
/
UzhvaD
/
Web_application_development_Course_work
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
js/transforms.js
127 строк
5 KB
UzhvaD
create: style.css, app.js, database.js, scheduler.js, transforms.js, ui.js, utils.js
03 май 2026, 16:07
Верифицирован
03 май 2026, 16:07
b7726da
Код
Авторство
О чём код?
// ==================== ТРАНСФОРМАЦИИ ДАННЫХ ==================== function transformRemoveDuplicates(csvText) { const { headers, data, delimiter } = csvToObjects(csvText); if (!headers.length) return { csv: csvText, removed: 0, message: 'нет данных' }; const seen = new Set(); const unique = data.filter(row => { const key = headers.map(h => row[h]).join('|'); if (seen.has(key)) return false; seen.add(key); return true; }); const removed = data.length - unique.length; return { csv: objectsToCsv(headers, unique, delimiter), removed: removed, message: `удалено ${removed} дубликатов` }; } function transformNormalizeNumbers(csvText) { const { headers, data, delimiter } = csvToObjects(csvText); if (!headers.length) return { csv: csvText, normalized: 0, message: 'нет данных' }; const numericCols = headers.filter(col => { return data.some(row => { const val = parseFloat(row[col]); return !isNaN(val) && isFinite(val); }); }); if (numericCols.length === 0) { return { csv: csvText, normalized: 0, message: 'числовые колонки не найдены' }; } const stats = {}; numericCols.forEach(col => { const values = data.map(row => parseFloat(row[col])).filter(v => !isNaN(v)); stats[col] = { min: Math.min(...values), max: Math.max(...values) }; }); const normalizedData = data.map(row => { const newRow = { ...row }; numericCols.forEach(col => { const val = parseFloat(row[col]); if (!isNaN(val) && stats[col].max !== stats[col].min) { newRow[col] = ((val - stats[col].min) / (stats[col].max - stats[col].min)).toFixed(4); } }); return newRow; }); return { csv: objectsToCsv(headers, normalizedData, delimiter), // ← ИСПРАВЛЕНО: normalizedData normalized: numericCols.length, message: `нормализовано ${numericCols.length} колонок` }; } function transformUppercase(csvText) { const { headers, data, delimiter } = csvToObjects(csvText); if (!headers.length) return { csv: csvText, processed: 0, message: 'нет данных' }; const processedData = data.map(row => { const newRow = { ...row }; headers.forEach(col => { if (typeof row[col] === 'string') { newRow[col] = row[col].toUpperCase(); } else if (row[col] !== undefined && row[col] !== null) { newRow[col] = String(row[col]).toUpperCase(); } }); return newRow; }); return { csv: objectsToCsv(headers, processedData, delimiter), // ← ИСПРАВЛЕНО: processedData processed: data.length, message: `обработано ${data.length} строк` }; } function transformFillNA(csvText, fillValue = 'N/A') { const { headers, data, delimiter } = csvToObjects(csvText); if (!headers.length) return { csv: csvText, filled: 0, message: 'нет данных' }; let filledCount = 0; const filledData = data.map(row => { const newRow = { ...row }; headers.forEach(col => { if (row[col] === undefined || row[col] === null || row[col].trim() === '') { newRow[col] = fillValue; filledCount++; } }); return newRow; }); return { csv: objectsToCsv(headers, filledData, delimiter), filled: filledCount, message: `заполнено ${filledCount} пропусков` }; } function applyTransform(transformType, csvText, options = {}) { switch (transformType) { case 'dedup': return transformRemoveDuplicates(csvText); case 'normalize': return transformNormalizeNumbers(csvText); case 'uppercase': return transformUppercase(csvText); case 'fillna': return transformFillNA(csvText, options.fillValue || 'N/A'); default: return { csv: csvText, message: 'неизвестная трансформация' }; } } window.applyTransform = applyTransform; window.transformRemoveDuplicates = transformRemoveDuplicates; window.transformNormalizeNumbers = transformNormalizeNumbers; window.transformUppercase = transformUppercase; window.transformFillNA = transformFillNA;