# Edit cells by hand

Shape / rows

change individual cells by hand, insert or delete specific rows

Page: <https://meridian.online/operations/edit-cells-by-hand>

## Status

Runs as a SQL step.

arcform carries it as a `sql:` step today.

## The DuckDB step

hand edits held as a patch table

It reads the `orders` table the proofs share. Create it first:

```sql
CREATE TABLE orders AS SELECT * FROM (VALUES
  (1,  'Alice Ng',      'north', DATE '2026-01-03', 120.00, 'widget', 'a|b',   '{"channel":"web","items":[1,2]}'),
  (2,  'alice ng',      'north', DATE '2026-01-05',  80.50, 'gadget', 'b',     '{"channel":"shop","items":[3]}'),
  (3,  'Bob  Okafor',   'south', DATE '2026-01-05', 300.00, 'widget', 'a|c',   '{"channel":"web","items":[4,5,6]}'),
  (4,  'Carla Díaz',    'east',  DATE '2026-01-09',  NULL,  'gizmo',  NULL,    '{"channel":"web","items":[]}'),
  (5,  'Bob Okafor',    'south', DATE '2026-01-12',  45.25, 'gadget', 'c',     '{"channel":"phone","items":[7]}'),
  (6,  'Dev Patel',     'west',  DATE '2026-01-12', 510.00, 'widget', 'a',     '{"channel":"web","items":[8,9]}'),
  (7,  'Carla Diaz',    'east',  DATE '2026-01-20',  99.99, 'gizmo',  'b|c',   '{"channel":"shop","items":[10]}'),
  (8,  'Dev Patel',     'west',  DATE '2026-02-02', 510.00, 'widget', 'a',     '{"channel":"web","items":[8,9]}'),
  (9,  'Eve Larsen',    NULL,    DATE '2026-02-03',  15.00, 'gadget', NULL,    '{"channel":"web","items":[11]}'),
  (10, 'Alice Ng',      'north', DATE '2026-02-10', 220.00, 'gizmo',  'a|b|c', '{"channel":"phone","items":[12,13]}')
) t(order_id, customer, region, order_date, amount, product, tags, meta);
```

Then run the statement:

```sql
CREATE TEMP TABLE result AS
WITH patch(order_id, amount) AS (VALUES (4, 75.00))
SELECT o.* REPLACE (coalesce(p.amount, o.amount) AS amount)
FROM orders o LEFT JOIN patch p USING (order_id);
SELECT * FROM result;
SELECT CASE WHEN ((SELECT max(amount) FILTER (WHERE order_id = 4) = 75 AND sum(amount) FILTER (WHERE order_id <> 4) = 1900.74 FROM result)) THEN 'as expected' ELSE error('the patch did not change order 4 alone') END AS verdict;
```

It needs nothing installed beyond DuckDB itself.

## Variants

- Cut, copy and paste cells or rows: Move cell values or rows through a clipboard into other cells or positions.
- Delete chosen rows: Remove specific rows, picked by hand or by a condition.
- Change cell values by hand: Type or set a new value over chosen cells, keeping every row.
- [Insert rows](https://meridian.online/operations/edit-cells-by-hand/insert-rows): Add blank, constant or supplied rows at a chosen position.
- Other hand edits: Annotate highlighted rows, shift cells sideways or restructure outline rows by hand.
- Replace whole rows: Swap matching rows, or a range of rows, for supplied replacement rows.

## What other tools call it

Meridian's classification; an independent blind rating agreed on 86.2% of 312 rows (exact class, version 2).

- DuckDB: [`DELETE`](https://duckdb.org/docs/current/sql/statements/delete) (read 2026-09-27)
- DuckDB: [`UPDATE`](https://duckdb.org/docs/current/sql/statements/update) (read 2026-09-27)
- KNIME Analytics Platform: [`Cell Updater`](https://api.hub.knime.com/nodes/*hXXFiDo1u_NOQ28t?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Constant Value Row Appender`](https://api.hub.knime.com/nodes/*k4Q1HIlGwZupSTmt?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Interactive HiLite Collector`](https://api.hub.knime.com/nodes/*ECOnjA_2n00PG80y?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Table Editor (JavaScript) (legacy)`](https://api.hub.knime.com/nodes/*HULBKvmIGFoAlt8y?details=full) (read 2026-09-27)
- OpenRefine: [`Add blank rows`](https://github.com/OpenRefine/OpenRefine/blob/master/main/webapp/modules/core/scripts/views/data-table/data-table-view.js) (read 2026-09-27)
- OpenRefine: [`Edit one cell at a time`](https://openrefine.org/docs/manual/cellediting#edit-one-cell-at-a-time) (read 2026-09-27)
- Polars: [`DataFrame.__setitem__`](https://docs.pola.rs/api/python/stable/reference/dataframe/modify_select.html) (read 2026-09-27)
- Power Query M: [`Table.InsertRows`](https://learn.microsoft.com/en-us/powerquery-m/table-functions#row-operations) (read 2026-09-27)
- Power Query M: [`Table.ReplaceMatchingRows`](https://learn.microsoft.com/en-us/powerquery-m/table-functions#membership) (read 2026-09-27)
- Power Query M: [`Table.ReplaceRows`](https://learn.microsoft.com/en-us/powerquery-m/table-functions#row-operations) (read 2026-09-27)
- RapidMiner Studio: [`Set Data`](https://docs.rapidminer.com/latest/studio/operators/blending/values/set_data.html) (read 2026-09-27)
- Tableau Prep: [`Edit Value`](https://help.tableau.com/current/prep/en-us/prep_clean.htm) (read 2026-09-27)
- VisiData: [`add-row`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/modify.py#L357) (read 2026-09-23)
- VisiData: [`add-rows`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/modify.py#L358) (read 2026-09-23)
- VisiData: [`autoedit-N`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/experimental/digit_autoedit.py#L6) (read 2026-09-23)
- VisiData: [`combine-selected`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/loaders/orgmode.py#L420) (read 2026-09-23)
- VisiData: [`copy-cell`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L202) (read 2026-09-23)
- VisiData: [`copy-cells`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L216) (read 2026-09-23)
- VisiData: [`copy-row`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L195) (read 2026-09-23)
- VisiData: [`copy-selected`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L200) (read 2026-09-23)
- VisiData: [`cut-cell`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L228) (read 2026-09-23)
- VisiData: [`cut-cells`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L229) (read 2026-09-23)
- VisiData: [`cut-row`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L226) (read 2026-09-23)
- VisiData: [`cut-selected`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L227) (read 2026-09-23)
- VisiData: [`delete-row`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L205) (read 2026-09-23)
- VisiData: [`edit-cell`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/sheets.py#L1296) (read 2026-09-23)
- VisiData: [`paste-after`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L197) (read 2026-09-23)
- VisiData: [`paste-before`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L198) (read 2026-09-23)
- VisiData: [`paste-cell`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L203) (read 2026-09-23)
- VisiData: [`paste-data`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/loaders/orgmode.py#L422) (read 2026-09-23)
- VisiData: [`paste-sections`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/loaders/orgmode.py#L423) (read 2026-09-23)
- VisiData: [`setcol-clipboard`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L217) (read 2026-09-23)
- VisiData: [`setcol-input`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/sheets.py#L1297) (read 2026-09-23)
- VisiData: [`slide-cells-right`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/experimental/slide_cells.py#L20) (read 2026-09-23)
- VisiData: [`sysedit-cell`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/features/sysedit.py#L51) (read 2026-09-23)
- VisiData: [`sysedit-selected`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/features/sysedit.py#L52) (read 2026-09-23)
- VisiData: [`syspaste-cells`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L211) (read 2026-09-23)
- VisiData: [`syspaste-cells-selected`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/clipboard.py#L214) (read 2026-09-23)
