The CSV Importer is opened from Data → New Data → Import from CSV.
This utility imports a delimited text file — a spreadsheet export, a record transcribed from a report, output from another tool.
A delimited file declares nothing about itself. No units, no parameter, no time basis. So a CSV import is a proposal HEC-Neptune makes and the user confirms — which is why this tool has a mapping step and the HEC-DSS and USGS importers do not.
There are two steps in the importer as outlined below.
Step 1 — Structure

| Structure Type | Informs the utility of the type of data being imported. |
| Source | Read-only. The Browse button opens a file picker, or you can drag a file onto the field. `.csv` and `.txt` accepted. |
| Name | Defaults to the file name without its extension. Base of every dataset this import creates. |
| Description | Optional. Applied to every dataset this import creates. |
Choosing a file reads it immediately; a read failure is reported inline. The Next button requires a file with content.
Step 2 — Data: how the file is parsed
Neptune detects the delimiter itself, scoring comma, tab, semicolon, and pipe across the first 25 rows and choosing the one that appears most consistently.
Quoted fields are honored, including a delimiter or a newline inside quotes. A UTF-8 byte-order mark — which Excel writes — is stripped, so the first header still matches by name.
Whether the first row is a header is inferred and reported as Header detected / No header detected .
Step 2 — Data: column mapping

| # | Column position. |
| Header | The header text, or (none). |
| Role | Ignore, Date/Time, or Value. The utility will attempt to infer the role that each column in a dataset carries. If a dataset contains columns that do not need to be imported, they can be set to Ignore. |
| Output name | The series name for this column. Defaults to the header. |
| Parameter | Required for a Value column. Decides the project-tree category. |
| Units | Required for a Value column. Filtered to the units valid for the parameter. |
| Value type | Required for a Value column. |
| Inferred | What the parser thought the column was: "dateTime", "number", or "text". |
| Sample | The first few cells. |
Roles are pre-assigned: the column with the strongest date signal becomes Date/Time, every other numeric column becomes Value, everything else Ignore. Correct as needed.
Parameter, Units, and Value Type are enabled only on Value columns; each shows green when filled and an error state when not. Import Data stays disabled until every Value column has all three.
Preview shows the first 15 rows and first 8 columns as parsed — use it to confirm the delimiter and header detection before mapping columns.
What the import produces
A CSV import produces time series only — there is no X/Y axis to map a column onto, so paired data cannot be imported this way. One time series per Value column.
Each series is named "<Name> - <Output name>", with a number appended on collision ("… (2)").
Rows are read from the first data row (after the header, if one was detected). A row is skipped when the date/time cell is blank or does not parse, or the value cell is blank or does not parse as a number. Numbers tolerate thousands separators ("1,234" reads as 1234).
A blank cell is treated as a gap, not a zero. An empty cell parsed as "0" would be a fabricated observation in a gage record.
Times are converted to UTC. The delimiter, whether a header was found, and which source columns supplied the date/time and the values are recorded with the dataset, along with the source file name and path as the re-import key.