Here's a solution utilising the [pivot_vtab](https://github.com/jakethaw/pivot_vtab) extension: ```sql -- -- Import data -- .mode csv CREATE TABLE import(val); .import tmp.txt import -- -- Create groups based on the 2 blank rows rule -- ALTER TABLE import ADD COLUMN g INT; UPDATE import SET g = oid WHERE oid = 1 OR oid IN (SELECT i2.oid+1 FROM import i JOIN import i2 ON i.oid = i2.oid-1 AND i2.val = '' WHERE i.val = ''); UPDATE import SET g = i2.g FROM import i2 LEFT JOIN import i3 ON import.oid > i3.oid AND i2.oid < i3.oid AND i3.g IS NOT NULL WHERE import.g IS NULL AND import.oid > i2.oid AND i2.g IS NOT NULL AND i3.oid IS NULL; -- -- Number the columns -- ALTER TABLE import ADD COLUMN c INT; UPDATE import SET c = x.c FROM (SELECT oid, Row_Number() OVER (PARTITION BY g ORDER BY oid) c FROM import) x WHERE import.oid = x.oid; -- -- Pivot -- .load pivot_vtab CREATE VIRTUAL TABLE pivot USING pivot_vtab( -- Pivot table row query (SELECT g FROM import GROUP BY g), -- Pivot table column definition query (SELECT c, 'col' || c FROM import WHERE c <= (SELECT Max(c)-2 FROM import) GROUP BY c ORDER BY c), -- Pivot query (SELECT val FROM import WHERE g = ?1 AND c = ?2) ); .mode column SELECT * FROM pivot; ``` ```bash g col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 -- ------------------------------------------------ ------- -------------------- ------------------------ ---------- ---- ---- ---- ---- ----- ----- ----- ----- ----- ----- ----- 1 Hardside Cabin Luggage Trolley Black senator View Product Details N18602991A KH132-20_BLK KH13220BLK 02 Days 04 Hrs 25 Mins 25 Sec 1 1 0 19 Hardside 4 Wheels Cabin Luggage Trolley Burgundy senator View Product Details N42588980A KH134-20_BGN KH13420BGN 02 Days 04 Hrs 25 Mins 25 Sec 1 1 0 37 Softside Cabin Luggage Trolley Purple senator View Product Details N32139616A LL051-20_PRP LL05120PRP 02 Days 09 Hrs 25 Mins 25 Sec 1 1 0 ```