{"record":{"id":"fc7c39ad0a8cb641","repo":"tonhowtf/omniget","slug":"csv-row-import-errors-rendered-to-user-result-data-errors","errorCode":null,"errorMessage":"CSV row import errors rendered to user: \"{result.data.errors.length} linhas com erro\" list","messagePattern":"CSV row import errors rendered to user: \"(.+?) linhas com erro\" list","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/routes/study/anki/import/+page.svelte","lineNumber":429,"sourceCode":"  {#if result}\n    <section class=\"card result-card\">\n      <header class=\"card-head\">\n        <h2>Importação concluída</h2>\n        <span class=\"kind-badge\">{result.kind.toUpperCase()}</span>\n      </header>\n      <ul class=\"summary-list\">\n        {#each summaryRows(result) as row (row.label)}\n          <li>\n            <span class=\"row-label\">{row.label}</span>\n            <span class=\"row-value\">{row.value}</span>\n          </li>\n        {/each}\n      </ul>\n      {#if result.kind === \"csv\" && result.data.errors.length > 0}\n        <details class=\"errors\">\n          <summary>{result.data.errors.length} linhas com erro</summary>\n          <ul>\n            {#each result.data.errors.slice(0, 20) as err (err)}\n              <li>{err}</li>\n            {/each}\n            {#if result.data.errors.length > 20}\n              <li class=\"muted\">… e mais {result.data.errors.length - 20}</li>\n            {/if}\n          </ul>\n        </details>\n      {/if}\n      <footer class=\"card-foot\">\n        <a class=\"back-link\" href=\"/study/anki\">Ver no painel →</a>\n      </footer>\n    </section>\n  {/if}\n</section>\n\n<style>\n  .study-page {\n    display: flex;","sourceCodeStart":411,"sourceCodeEnd":447,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src/routes/study/anki/import/+page.svelte#L411-L447","documentation":"Not a thrown error but UI rendering of per-row CSV import failures: the Anki CSV import result carries a data.errors array, and the page shows the count plus up to 20 individual row errors in a collapsible list.","triggerScenarios":"Importing a CSV where some rows fail validation/mapping (missing fields, bad encoding, wrong delimiter, invalid note fields), producing result.data.errors.length > 0.","commonSituations":"CSV exported with different columns than the expected template, semicolon vs comma delimiters, non-UTF-8 encodings, or rows with empty required fields.","solutions":["Expand the errors <details> and fix the first listed rows in the source CSV","Re-export the CSV matching the expected header/column template","Ensure UTF-8 encoding and correct delimiter","Re-import after correcting rows; the '… e mais N' line indicates remaining rows"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const rows = csv.split(/\\r?\\n/).slice(1).filter(r => r.trim());\nconst expectedCols = 3; // match import template\nconst bad = rows.filter(r => r.split(\",\").length !== expectedCols);\nif (bad.length > 0) warnUserBeforeImport(bad.length);","typeGuard":"function isCsvResult(r: ImportResult): r is { kind: \"csv\"; data: { errors: string[] } } {\n  return r.kind === \"csv\" && Array.isArray((r.data as { errors?: unknown }).errors);\n}","tryCatchPattern":"if (result.kind === \"csv\" && result.data.errors.length > 0) {\n  console.warn(`CSV import: ${result.data.errors.length} rows failed`, result.data.errors.slice(0, 20));\n}","preventionTips":["Use the documented CSV template with exact headers","Save CSVs as UTF-8 with the expected delimiter","Validate a small sample file before bulk imports","Review the errors list and fix source rows before re-import"],"tags":["csv","import","validation"],"backgroundTag":"schema-validation-failed","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}