Zie619/n8n-workflows · error · Error
${fileName} → ${baseName} → Unrecognized file name structure
Error message
${fileName} → ${baseName} → Unrecognized file name structure What it means
Thrown by the 'Format Data' Code node in an automation-triggered file-ingestion workflow. It buckets incoming files into known categories (search_terms, campaigns, targeting, placement, budgets) by regex-testing the lowercased base filename. When no regex matches, the node throws with the offending fileName and derived baseName embedded in the message.
Source
Thrown at workflows/Code/1301_Code_Extractfromfile_Automation_Triggered.json:167
"type": "n8n-nodes-base.merge",
"position": [
1200,
-800
],
"parameters": {},
"typeVersion": 3.1,
"notes": "This merge node performs automated tasks as part of the workflow."
},
{
"id": "cd23e23c-9bb7-4b8d-90ab-8917783cf1ab",
"name": "Format Data",
"type": "n8n-nodes-base.code",
"position": [
1420,
-800
],
"parameters": {
"jsCode": "const result = {};\n\nfor (const item of items) {\n const fileName = item.json.fileName || item.json.name || 'unknown_file';\n const baseName = fileName\n .split('.')[0]\n .replace(/\\s+/g, '_')\n .toLowerCase()\n .replace(/\\s*\\(\\d+\\)$/, '')\n .replace(/_+$/, '')\n .trim();\n\n // regex → result key\n const map = [\n { key: 'search_terms', regex: /search_term/ },\n { key: 'campaigns', regex: /campaign/ },\n { key: 'targeting', regex: /targeting/ },\n { key: 'placement', regex: /placement/ },\n { key: 'budgets', regex: /budget/ },\n ];\n\n const entry = map.find(m => m.regex.test(baseName));\n const mappedKey = entry ? entry.key : null;\n\n console.log('fileName:', fileName);\n console.log('baseName:', baseName);\n console.log('mappedKey:', mappedKey);\n\n if (!mappedKey) {\n throw new Error(`${fileName} → ${baseName} → Unrecognized file name structure`);\n }\n result[mappedKey] = result[mappedKey] || [];\n result[mappedKey].push(item.json);\n}\n\nreturn [{ json: result }];\n\n\n\n"
},
"typeVersion": 2,
"notes": "This code node performs automated tasks as part of the workflow."
},
{
"id": "02172577-d867-45a4-96ea-eb105169deff",
"name": "Set fileName",
"type": "n8n-nodes-base.set",
"position": [
320,
-800
],
"parameters": {
"options": {
"dotNotation": true,
"ignoreConversionErrors": false
},
"assignments": {View on GitHub (pinned to 94007c1445)
Solutions
- Rename the uploaded file so its base name contains one of the known keywords: search_term, campaign, targeting, placement, budget.
- Inspect the error message's fileName → baseName chain to see exactly what base string the node derived, then fix the source of that name (uploader or naming convention).
- Extend the `map` array with a new { key, regex } entry if a legitimate new file type must be supported.
- Replace the hard throw with routing to a quarantine/error branch (e.g. result['unrecognized'].push) plus a notification, if unknown files should not kill the run.
Example fix
// before
if (!mappedKey) {
throw new Error(`${fileName} → ${baseName} → Unrecognized file name structure`);
}
// after (collect and flag instead of halting the whole batch)
if (!mappedKey) {
result['unrecognized'] = result['unrecognized'] || [];
result['unrecognized'].push({ fileName, reason: 'no matching keyword' });
continue;
} Defensive patterns
Strategy: type-guard
Validate before calling
const KNOWN = /search_term|campaign|targeting|placement|budget/;
const fileName = item.json.fileName || item.json.name || 'unknown_file';
const baseName = fileName.split('.')[0].replace(/\s+/g, '_').toLowerCase();
const recognized = KNOWN.test(baseName); Type guard
function classifyFile(baseName) {
const map = [
{ key: 'search_terms', regex: /search_term/ },
{ key: 'campaigns', regex: /campaign/ },
{ key: 'targeting', regex: /targeting/ },
{ key: 'placement', regex: /placement/ },
{ key: 'budgets', regex: /budget/ }
];
return map.find(m => m.regex.test(baseName))?.key ?? null;
} Try / catch
for (const item of items) {
const key = classifyFile(baseNameOf(item));
if (!key) { result['unrecognized'] = result['unrecognized'] || []; result['unrecognized'].push(item.json); continue; }
(result[key] = result[key] || []).push(item.json);
} Prevention
- Publish and enforce a file-naming convention with the five keywords.
- Route unrecognized files to a quarantine bucket plus a Slack/email alert instead of throwing.
- Keep the keyword map in one place so adding a report type updates a single array.
- Strip Excel lock files (~$ prefix) and thumbnails before they reach this node.
When it happens
Trigger: An uploaded file whose base name (after splitting at the first '.', lowercasing, trimming trailing digits/underscores) contains none of: 'search_term', 'campaign', 'targeting', 'placement', 'budget'. Examples: 'ad_creative_v2.csv', 'audience_list.xlsx', a temp file like '~$budgets.xlsx' split at first dot yielding '~$budgets' still matches budget, but 'report (1).json' or 'Untitled.json' do not. Also files with no extension or names like 'Budget-Final.v2.csv' (split at first dot gives 'budget-final' which still matches 'budget') — the real failures are genuinely off-vocabulary names.
Common situations: Marketers renaming template files ('Q4 budgts.xlsx' typo), uploading extra files (README, images, ~$ Excel lock files with the dot split producing unexpected fragments), double extensions truncating the meaningful part ('campaigns.xlsx.csv' → base 'campaigns' still matches), or new report types added to the source system that the map was never updated for.
Related errors
- Approved quantity must be greater than 0
- The video ID parameter is empty.
- Invalid data structure
- Could not find video URL in the JSON data.
- Could not find __UNIVERSAL_DATA_FOR_REHYDRATION__ script in
AI-assisted analysis of Zie619/n8n-workflows@94007c1445 (2026-08-15).
Data as JSON: /api/errors/461d72417b3e2f11.
Report an issue: GitHub.