sql >> Database >  >> RDS >> PostgreSQL

COPY slechts enkele kolommen van een invoer-CSV?

Ik weet niet waar je die syntaxis vandaan hebt, maar COPY neemt geen lijst van dergelijke kolomaliassen. Zie de hulp:

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

(AS is niet een van de vermelde opties; om de volledige uitvoer te zien, voer \d copy uit in psql, of bekijk de handleiding voor de copy commando online).

Er is geen kaartvoorziening in COPY waarmee u slechts enkele kolommen van de invoer-CSV kunt lezen. Het zou erg handig zijn, maar niemand heeft de tijd/interesse/financiering gehad om het te implementeren. Het is eigenlijk maar een van de vele taken voor gegevenstransformatie/filtering die mensen toch willen.

PostgreSQL verwacht de kolomlijst gegeven in COPY in dezelfde volgorde moeten staan, van links naar rechts, als wat er in het CSV-bestand staat, en hetzelfde aantal vermeldingen hebben als het CSV-bestand kolommen heeft. Dus als je schrijft:

COPY con (date,kgs)

dan verwacht PostgreSQL een invoer-CSV met exact twee kolommen . Het gebruikt de eerste csv-kolom voor de "date" tabelkolom en de tweede csv-kolom voor de "kgs" tabel kolom. Het maakt niet uit wat de CSV-headers zijn, ze worden genegeerd als u WITH (FORMAT CSV, HEADER ON) opgeeft , of behandeld als normale gegevensrijen als u HEADER niet opgeeft .

PostgreSQL 9.4 voegt FROM PROGRAM toe naar COPY , dus je zou een shell-opdracht kunnen uitvoeren om het bestand te lezen en te filteren. Een eenvoudig Python- of Perl-script zou het werk doen.

Als het een klein bestand is, open dan gewoon een kopie in de spreadsheet van je keuze als csv-bestand, verwijder de ongewenste kolommen en sla het op, dus alleen de date en kgs kolommen blijven.

Als alternatief, COPY naar een verzameltabel die allemaal dezelfde kolommen heeft als de CSV , doe dan een INSERT INTO ... SELECT om alleen de gewenste gegevens over te zetten naar de echte doeltabel.




  1. mySQL-som van twee waarden in 2 verschillende tabellen

  2. Hoe maak je een automatisch incrementeel veld in django dat begint bij 10000

  3. Hoe de MySql root-wachtwoordopdrachtregel in ubuntu linux te resetten/wijzigen?

  4. MySQL:gebruikersvariabele instellen op basis van resultaat van zoekopdracht