{"record":{"id":"2b702d4a1c17c5a2","repo":"tonhowtf/omniget","slug":"nenhum-csv-no-export-aponte-para-o-zip-do-linkedin-ou-para-a","errorCode":null,"errorMessage":"nenhum CSV no export; aponte para o zip do LinkedIn ou para a pasta extraida","messagePattern":"nenhum CSV no export; aponte para o zip do LinkedIn ou para a pasta extraida","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/linkedin/source.rs","lineNumber":100,"sourceCode":"                    continue;\n                }\n                let name = e.name().to_string();\n                entries.push(name.clone());\n                if is_csv(&name) {\n                    files.entry(key(&name)).or_insert(name);\n                }\n            }\n            Source::Zip {\n                path: p.to_path_buf(),\n                files,\n            }\n        };\n        let empty = match &source {\n            Source::Dir { files } => files.is_empty(),\n            Source::Zip { files, .. } => files.is_empty(),\n        };\n        if empty {\n            return Err(anyhow!(\n                \"nenhum CSV no export; aponte para o zip do LinkedIn ou para a pasta extraida\"\n            ));\n        }\n        entries.sort();\n        Ok(Opened { source, entries })\n    }\n\n    /// Nomes normalizados dos CSVs disponiveis.\n    pub fn names(&self) -> Vec<String> {\n        let mut v: Vec<String> = match self {\n            Source::Dir { files } => files.keys().cloned().collect(),\n            Source::Zip { files, .. } => files.keys().cloned().collect(),\n        };\n        v.sort();\n        v\n    }\n\n    /// Le um CSV pelo nome (aceita apelidos). Texto em UTF-8 tolerante.","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/linkedin/source.rs#L82-L118","documentation":"Source::open walks either the extracted directory (up to depth 4) or the zip's entries collecting CSV files, then checks whether the resulting file set is empty. If neither the zip nor the directory contains any CSVs, the export is useless to the parser and this error is returned.","triggerScenarios":"Opening a zip that is not a LinkedIn export (some other archive with no .csv files); opening a directory that contains only HTML/PDF parts of the export; pointing at the download page HTML file; an export requested without the CSV-producing data categories.","commonSituations":"User selected 'faster' LinkedIn export which may deliver fewer/differently packaged files; user extracted only part of the zip; user passed the wrong zip entirely (e.g. photos.zip); nested directories deeper than max_depth 4 hiding the CSVs.","solutions":["Point open() at the original LinkedIn export zip rather than a hand-modified/extracted folder — the zip path is the most reliable.","Verify the archive actually contains CSVs: `unzip -l export.zip | grep -i csv` or `find extracted_dir -name '*.csv'`.","Re-request the full export from LinkedIn and download the complete zip (the full export can take minutes to hours to prepare).","If the CSVs are nested deeper than 4 levels, flatten the directory before opening it."],"exampleFix":"// before\nSource::open(\"linkedin_photos.zip\")?; // not a data export\n\n// after\n// check contents first\n// unzip -l linkedin_export.zip | grep .csv\nSource::open(\"/downloads/linkedin_export.zip\")?;","handlingStrategy":"validation","validationCode":"let has_csv = if path.ends_with(\".zip\") {\n    std::process::Command::new(\"unzip\").args([\"-l\", &path]).output()\n        .map(|o| String::from_utf8_lossy(&o.stdout).to_lowercase().contains(\".csv\"))?\n} else {\n    walkdir::WalkDir::new(&path).into_iter().any(|e| {\n        e.map(|x| x.path().extension().map_or(false, |x| x == \"csv\")).unwrap_or(false)\n    })\n};\nanyhow::ensure!(has_csv, \"selected archive/folder contains no CSV files\");","typeGuard":null,"tryCatchPattern":"match Source::open(&path) {\n    Err(e) if e.to_string().contains(\"nenhum CSV\") => {\n        eprintln!(\"That's not a LinkedIn data export; re-download the full export zip\");\n    }\n    r => r?,\n}","preventionTips":["Only pass the original LinkedIn export zip, not partial extractions or other archives","Inspect archive contents before ingesting","Request the full (not quick) export from LinkedIn"],"tags":["empty-input","linkedin","csv","archive"],"backgroundTag":"empty-result-set","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}