ꘇ dat.table
Paste a CSV, get a table your graph can slice
- table
- text
The plain one
ꘇ dat.table is the least glamorous node in this pack and probably the one you'll actually use most, because it does one obvious thing: it parses delimited text into a table. Type (or wire, or paste) rows of text, pick a delimiter, and out comes a GENERETI_DAT table plus the same thing as CSV text.
Why care? Because a DAT table is the pivot format for everything else in Genereti's data family. Tables go into dat.select to slice, dat.transpose to flip, dat.replace to rename, dat.merge to concatenate, and dat.tochop to become control channels that drive faders, seeds, or a live parameter. If you want a spreadsheet to steer a Comfy graph, this node is step one.
How the parse works
There's no cleverness here - it's Python's csv module, which is the right call because CSV quoting is genuinely fiddly. Rows are read with the delimiter you selected, and the parser runs in strict mode, which means unterminated quotes raise instead of quietly producing nonsense. That's a feature: silent CSV corruption is far worse than an error.
Two details worth knowing before you debug something:
- Numeric-looking cells stay strings in the table. The
GENERETI_DATtype is a string table by design; conversion to numbers happens at the boundary, indat.tochop(which sends non-numeric cells to0.0) ordat.cell(which gives you a STRING and a FLOAT side by side). So don't expect the table itself to know0.5from"0.5". - The
textoutput isn't a passthrough of what you typed - it's a re-serialisation from the parsed rows, newline-terminated, comma-separated. If you typed tabs and pickedtab, the text output comes back comma-separated. Downstream nodes read the table, so this rarely matters, except when you're eyeballing it.
Inputs and outputs
Just two inputs:
text- the multiline editor, defaulting toname,value / speed,0.5 / influence,0.8. That default is a deliberate hint:name,valuepairs are exactly whatdat.tochopwants, because it uses row one as channel names.delimiter- a combo of,,tab,;,|. Picktabfor anything pasted out of a spreadsheet, where the "tab" option is mapped to a literal tab character before parsing.
Outputs are the DAT standard: table (GENERETI_DAT) and text (STRING, the CSV). Wire table into the operator chain, or wire text into dat.lesson/webview-style document nodes if you want to display it.
A pattern that's worth stealing if you're wiring live controls: paste a small table of parameter names and values, run it through dat.tochop with header on, and you get one CHOP channel per row - named. Feed the channel value output into a converted numeric widget and you've turned a text box into a control surface. It's a silly amount of leverage for a CSV.
Install
Genereti ships this node and nothing else does. Manager → search Genereti (publisher liuboto) → restart → refresh the browser. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/languel/genereti.git genereti
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt
Use your ComfyUI's own Python - python_embeded\python.exe on Windows Portable - rather than a global pip. The requirements file is a single line, comfyui-frontend-package>=1.53.6, so this is a light install: no models, no torch surgery, no extra node packs. It does need a recent ComfyUI (0.38.2+), Python 3.11+, and a browser refresh after every restart because the editor widget is frontend JavaScript.
Gotchas that will actually bite
strictCSV is strict. A stray"in a cell throws. Same for a row with an odd quote count. Fix the source text; there's no escape hatch.- It does not infer a header. Row one is a header only if a downstream node is told so -
dat.tochop'sheaderboolean, ordat.totop's. If you feed a headerless table intodat.tochopwithheaderon, your first data row silently becomes channel names. - Ragged rows are legal. Your
textoutput will be uneven; operators either pad or ignore missing columns depending on the node (dat.selectemits an empty string for out-of-range columns,dat.transposepads). - Zero community footprint, alpha code. The pack is explicitly "super alpha - early classroom testing; back up your workflows before updating," and it currently has essentially no discussion in the Reddit corpus. It's a stable little CSV parser; just don't assume the pack around it is done.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | name,value speed,0.5 influence,0.8 | — |
| delimiter | COMBO | 4 options: ,, tab, ;, | |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| table | GENERETI_DAT | — |
| text | STRING | — |