EZ CSV Loader
Turn a spreadsheet of prompts into a working library
- STRING
- OPT_FILEPATH
- BATCH_SELECTED
If you keep your prompt library in a spreadsheet - and you absolutely should, it's the most maintainable way to manage a serious collection - EZ CSV Loader is the node that gets it into ComfyUI. It reads a CSV file from the pack's data/CSV/ folder, shows you the rows as a friendly UI list, and outputs the selected row's content as a single formatted string. The author built it as part of the EZ-AF pack's "visual prompt-building" pitch, and it's the natural home for that big table of characters, styles, or full generation recipes you've been accumulating.
How it works
Every .csv file inside data/CSV/ (recursively, subfolders included) shows up in the csv_file dropdown. The first column is used as the label for each row in the UI - so put something human-readable there, like [portrait] warm studio or knight_armor_v3. The remaining columns are the payload, and here's the clever bit: the node outputs them all as one block, formatted so each column is prefixed with its header name, roughly like this:
[Header 1 = Name]:
3D RENDER
[Header 2 = Prompt]:
professional 3d render, intricate details...
That block format is why this node is designed to pair with EZ Extract Prompt - the extractor parses that [Header = ...] structure and pulls just the section you want. Use them together and a CSV becomes your entire prompt database: one row per generation recipe, headers for name/style/prompt/negative/size.
Inputs and modes
- csv_file - which CSV to load.
- selection_mode - single / multiple (comma-joined) / random, same three-mode system as the other loaders. Random takes
opt_seedfor reproducibility. - filter_text - filters visible rows by substring.
- selected_row - hidden-ish string that holds the current pick so the node persists on workflow save.
Outputs are STRING (the formatted row), OPT_FILEPATH (the file path), and BATCH_SELECTED (a list of all selected items - great for iterating every row in a folder). The CSV parsing is tolerant: it sniffs comma or semicolon delimiters automatically, and the first line is always treated as headers.
What to watch for
Two things. First, a CSV needs at least a header row plus one data row, or you get a friendly "No data rows found in file" message instead of output. Second, the raw STRING output is meant to be processed - wiring it straight into a text encoder usually gives you all the headers and sections at once, which is not what you want. The expected pattern is CSV Loader → EZ Extract Prompt → CLIP Text Encode.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/ez-af/ComfyUI-EZ-AF-Nodes.git
restart, or ComfyUI Manager → search ez-af. No models; deps are just aiohttp and Pillow. Drop your CSVs into data/CSV/, restart so the loader rescans, and you've got a spreadsheet-driven prompt library in five minutes.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| csv_file | COMBO | CSV file to search for text by row | |
| selection_mode | COMBO | single | - single: Allows selection of one item at a time. - multiple: Allows selection of multiple items. Output will be comma-separated. - random: Allows selection of multiple items. Randomly outputs one of the selected items on each prompt queue. Will select from all visible (filtered) items if none or single item is selected. Uses seed if opt_seed is connected. Always re-executes node if opt_seed is not connected |
| opt_seedopt | INT | 00–18446744073709550000 | Control SEED, used only in 'random' selection mode. If not connected, always re-executes node on prompt |
| filter_textopt | STRING | Filter items based on a text string | |
| selected_rowopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | Content of selected row(s). Usually needs to be processed by Prompt Extractor |
| OPT_FILEPATH | STRING | Path to currently selected csv file. |
| BATCH_SELECTED | STRING | List of all selected items. Will output all visible (filtered) items if none or single item is selected. |