---
name: from_csv
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "from_csv(text: str, delimiter: str = ',', has_header: bool = True) -> list[dict]"
description: "Parser CSV a datos tabulares. Complemento de to_csv. Soporta campos entre comillas con escaping RFC 4180. Si has_header=False, genera keys col_0, col_1, etc."
tags: [csv, parser, import, tabular, format, pendiente-usar, extractor]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: text
    desc: "string con contenido CSV"
  - name: delimiter
    desc: "caracter delimitador de campos (default coma)"
  - name: has_header
    desc: "si True la primera fila se usa como nombres de columnas"
output: "lista de dicts donde cada dict es una fila y las keys son los nombres de columnas"
tested: true
tests:
  - "csv simple con header"
  - "campos con escaping"
  - "sin header keys generadas"
  - "lineas vacias ignoradas"
  - "un solo campo por fila"
test_file_path: "python/functions/core/from_csv_test.py"
file_path: "python/functions/core/from_csv.py"
---

## Ejemplo

```python
text = "nombre,edad\r\nAna,30\r\nBob,25"
rows = from_csv(text)
# [{"nombre": "Ana", "edad": "30"}, {"nombre": "Bob", "edad": "25"}]

# Sin header
text = "Ana,30\nBob,25"
rows = from_csv(text, has_header=False)
# [{"col_0": "Ana", "col_1": "30"}, {"col_0": "Bob", "col_1": "25"}]

# Con escaping
text = 'a,b\r\n"dijo ""hola""","uno,dos"'
rows = from_csv(text)
# [{"a": 'dijo "hola"', "b": "uno,dos"}]
```

## Notas

Parser manual sin el modulo csv de stdlib. Normaliza CRLF y LF antes de procesar.
Ignora lineas vacias. Todos los valores son strings — la conversion de tipos queda a cargo del caller.
