Zum Hauptinhalt springen
claw
am
tools
Werkzeuge
Dokumente
Daoark
EN
Startseite
Startseite
/
Datenkonvertierung
›
Startseite
manifest.json
0; }); if (lines.length === 0) return { headers: [], rows: [] }; function splitLine(line) { var out = []; var cur = ''; var inQuote = false; for (var i = 0; i < line.length; i++) { var c = line[i]; if (c === '"') { inQuote = !inQuote; } else if (c === ',' || c === '\t' || c === ';') { if (!inQuote) { out.push(cur); cur = ''; } else cur += c; } else cur += c; } out.push(cur); return out.map(function(s) { return s.trim().replace(/^"|"$/g, ''); }); } var headers = splitLine(lines[0]); var rows = []; for (var i = 1; i < lines.length; i++) rows.push(splitLine(lines[i])); return { headers: headers, rows: rows }; } function toCSV(headers, rows) { var out = [headers.join(',')]; for (var i = 0; i < rows.length; i++) { var r = rows[i].map(function(c) { return /[",\n]/.test(c) ? '"' + c.replace(/"/g, '""') + '"' : c; }); out.push(r.join(',')); } return out.join('\n'); } function isNum(s) { return !isNaN(parseFloat(s)) && isFinite(s); } function refreshGroups() { var op = $('op').value; $('g-sort').style.display = op === 'sort' ? 'block' : 'none'; $('g-filter').style.display = op === 'filter' ? 'block' : 'none'; $('g-sql').style.display = op === 'tosql' ? 'block' : 'none'; } $('op').addEventListener('change', refreshGroups); refreshGroups(); var lastResult = ''; function doProcess() { try { var text = getVal('text-a'); if (!text) { showError('请输入'); return; } var op = $('op').value; var data = parseCSV(text); if (data.headers.length === 0) { showError('无有效数据'); return; } var out = ''; if (op === 'stats') { out = '总行数: ' + data.rows.length + '\n总列数: ' + data.headers.length + '\n\n=== 每列统计 ==='; for (var c = 0; c < data.headers.length; c++) { var colName = data.headers[c]; var vals = data.rows.map(function(r) { return r[c]; }); var unique = {}; vals.forEach(function(v) { unique[v] = true; }); var numVals = vals.filter(isNum).map(parseFloat); out += '\n[' + colName + ']\n unique: ' + Object.keys(unique).length; if (numVals.length > 0 && numVals.length === vals.length) { var min = Math.min.apply(null, numVals); var max = Math.max.apply(null, numVals); var avg = numVals.reduce(function(s, x) { return s + x; }, 0) / numVals.length; var sum = numVals.reduce(function(s, x) { return s + x; }, 0); out += '\n min: ' + min + ', max: ' + max + ', avg: ' + avg.toFixed(2) + ', sum: ' + sum.toFixed(2); } else { out += '\n 文本列,示例: ' + vals.slice(0, 3).join(', '); } } } else if (op === 'dedup') { var seen = {}; var newRows = []; for (var r = 0; r < data.rows.length; r++) { var k = data.rows[r].join('|'); if (!seen[k]) { seen[k] = true; newRows.push(data.rows[r]); } } out = '原行数: ' + data.rows.length + '\n去重后: ' + newRows.length + '\n\n' + toCSV(data.headers, newRows); lastResult = toCSV(data.headers, newRows); } else if (op === 'sort') { var sortCol = $('sort-col').value.trim(); var desc = $('sort-desc').checked; var idx = data.headers.indexOf(sortCol); if (idx < 0) { showError('找不到列: ' + sortCol); return; } var sorted = data.rows.slice().sort(function(a, b) { var va = a[idx], vb = b[idx]; if (isNum(va) && isNum(vb)) return desc ? parseFloat(vb) - parseFloat(va) : parseFloat(va) - parseFloat(vb); return desc ? vb.localeCompare(va) : va.localeCompare(vb); }); out = '按 ' + sortCol + (desc ? ' 降序' : ' 升序') + ' 排序\n\n' + toCSV(data.headers, sorted); lastResult = toCSV(data.headers, sorted); } else if (op === 'filter') { var kw = $('filter-kw').value; if (!kw) { showError('请输入关键词'); return; } var filtered = data.rows.filter(function(r) { return r.some(function(c) { return c.indexOf(kw) >= 0; }); }); out = '筛选 "' + kw + '": ' + filtered.length + ' / ' + data.rows.length + ' 行\n\n' + toCSV(data.headers, filtered); lastResult = toCSV(data.headers, filtered); } else if (op === 'tojson') { var arr = data.rows.map(function(r) { var obj = {}; for (var i = 0; i < data.headers.length; i++) obj[data.headers[i]] = isNum(r[i]) ? parseFloat(r[i]) : r[i]; return obj; }); out = JSON.stringify(arr, null, 2); lastResult = out; } else if (op === 'tosql') { var tbl = $('tbl-name').value.trim() || 'my_table'; var sql = 'CREATE TABLE ' + tbl + ' (\n' + data.headers.map(function(h) { return ' ' + h.replace(/[^\w]/g, '') + ' TEXT'; }).join(',\n') + '\n);\n\n' + data.rows.map(function(r) { var vals = r.map(function(c) { return "'" + c.replace(/'/g, "''") + "'"; }); return 'INSERT INTO ' + tbl + ' (' + data.headers.map(function(h) { return h.replace(/[^\w]/g, ''); }).join(', ') + ') VALUES (' + vals.join(', ') + ');'; }).join('\n'); out = sql; lastResult = out; } else if (op === 'tomd') { var md = '| ' + data.headers.join(' | ') + ' |\n|' + data.headers.map(function() { return '------'; }).join('|') + '|\n'; for (var k = 0; k < data.rows.length; k++) md += '| ' + data.rows[k].join(' | ') + ' |\n'; out = md; lastResult = out; } showResult(out, op + ', ' + data.rows.length + ' 行'); } catch (e) { showError('处理失败: ' + (e.message || e)); } } $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doProcess(); }); $('btn-copy').addEventListener('click', function() { if (lastResult && navigator.clipboard) navigator.clipboard.writeText(lastResult); }); $('btn-download').addEventListener('click', function() { if (!lastResult) return; var op = $('op').value; var ext = op === 'tojson' ? 'json' : op === 'tosql' ? 'sql' : op === 'tomd' ? 'md' : 'csv'; var mime = op === 'tojson' ? 'application/json' : op === 'tosql' ? 'text/plain' : 'text/plain'; var blob = new Blob([lastResult], { type: mime + ';charset=utf-8' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'csv-output.' + ext; a.click(); URL.revokeObjectURL(url); }); $('btn-clear').addEventListener('click', function() { var inputs = document.querySelectorAll('input,textarea,select'); for (var i = 0; i < inputs.length; i++) { if (inputs[i].tagName === 'SELECT') inputs[i].selectedIndex = 0; else if (inputs[i].type === 'checkbox') inputs[i].checked = false; else inputs[i].value = inputs[i].defaultValue; } lastResult = ''; refreshGroups(); var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; $('btn-copy').style.display = 'none'; $('btn-download').style.display = 'none'; }); })();