# Analiza SQL Excela, CSV i Parquet w przeglądarce na C++ i WebAssembly
WebAssembly pozwala uruchamiać kod C++17 do parsowania danych tabelarycznych bezpośrednio w przeglądarce. Rozwiązanie oparte na excel_loader zapewnia wirtualizację plików jako tabel SQL: XLSX, Parquet, CSV są montowane bez pełnego ładowania do pamięci. To eliminuje blokowanie UI i wycieki pamięci w bibliotekach JS, zachowując prywatność danych na urządzeniu użytkownika.
Architektura łączy rdzeń C++ z interoperacją Emscripten i powłoką JS. Silnik rozpoznaje format po sygnaturze blob, obsługuje JOIN między heterogenicznymi plikami w jednym Workbook.
Architektura: od parsowania do zapytań SQL
Rdzeń C++ excel_loader obsługuje parsowanie za pomocą natywnych bibliotek, buduje wirtualne tabele i planuje zapytania. Emscripten eksportuje klasy ExcelLoaderEngine, Workbook, QueryResult do JS. Warstwa kliencka przekazuje ArrayBuffer z inputu i otrzymuje wynik JSON.
Workbook — centralna abstrakcja: kontener dla kilku plików jako jednej bazy danych. Obsługiwane formaty:
- Excel/Office: XLSX, XLSB, XLS, ODS
- Flat Files: CSV, TSV, TXT
- Columnar/BigData: Parquet, DuckDB, ORC, AVRO
- Legacy DB: SQLite, DBF, MDB, ACCDB
- NoSQL/Docs: JSON, JSONL, XML, HTML
Automatyczne rozpoznawanie formatu ułatwia integrację: frontend przekazuje Uint8Array bez wstępnego przetwarzania.
Praktyczna implementacja API
Inicjalizacja WASM i ładowanie pliku wymaga minimum kodu. Silnik sam rozpoznaje typ.
// Initialization WASM-modulya
const module = await ExcelLoaderModule();
const engine = new module.ExcelLoaderEngine();
// Poluchaem file from standartnogo input
const fileInput = document.getElementById("fileUploader");
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
// Otkryvaem file how Workbook
const workbook = engine.openSingleFile(
file.name,
new Uint8Array(arrayBuffer)
);
window.currentWorkbook = workbook;
Wykonanie zapytania SQL na zamontowanym pliku:
const sql = "SELECT * FROM 'Sheet1' WHERE Amount > 1000 ORDER BY Date DESC LIMIT 10";
try {
const result = window.currentWorkbook.executeQuery(sql);
const data = result.toJSON();
console.table(data);
} catch (e) {
console.error("SQL Error:", e);
}
Dla projektów wieloplikowych używany jest manifest JSON:
// manifest.json
{
"files": [
{ "name": "data_2023.parquet", "alias": "History" },
{ "name": "new_orders.csv", "alias": "Current" }
]
}
const workbook = openProjectFromManifest(engine, manifestJson, fileBuffers);
// Dostupno: SELECT * FROM History JOIN Current ...
Metadane i wydajność
Metoda getStats() zwraca strukturę danych bez wykonywania zapytań:
{
"name": "sheet1$",
"displayName": "Otchet_Prodazhi",
"fileName": "report_final.xlsx",
"type": "excel-sheet",
"rows": 15400,
"columns": 24,
"memoryUsage": "..."
}
Operacje In-Memory w C++ minimalizują narzut w porównaniu z V8. Parquet jest odczytywany efektywnie dzięki strukturom kolumnowym i wektoryzacji.
Kluczowe zalety wydajnościowe:
- Brak blokowania UI przy parsowaniu plików 50+ MB
- JOIN między XLSX i CSV bez serwera
- Minimalne zużycie pamięci w porównaniu z alternatywami JS (SheetJS, AlaSQL)
- Praca offline z metadanymi dla UI
Zastosowanie w rozwoju
Rozwiązanie nadaje się dla programistów frontend i fullstack na poziomie middle/senior.
- Local-First dashboardy: Pełna analiza offline bez przekazywania danych
- Walidacja kliencka: Reguły SQL do sprawdzania plików przed uploadem
- Konwertery: Parquet → filtr SQL → JSON/CSV w przeglądarce
- Rozszerzenia edytorów biurowych: SQL po komórkach w wersjach webowych
Co ważne
- Wirtualne tabele montują pliki bez pełnego ładowania do RAM
- Automatyczne rozpoznawanie 15+ formatów po sygnaturze blob
- Workbook obsługuje JOIN heterogenicznych źródeł jako jednej bazy danych
- C++ przez WASM przewyższa JS prędkością na dużych zbiorach danych
- Pełna prywatność: dane nie opuszczają przeglądarki
— Editorial Team
Brak komentarzy.