CodeKitHub
JSON-værktøjer

CSV til SQL-konverter

Senest opdateret:

For at omdanne en CSV-række til SQL bliver hver kolonne til en værdi i en INSERT INTO-sætning — tal forbliver uden anførselstegn, tekst pakkes ind i enkelte anførselstegn med interne anførselstegn fordoblet (O'Brien bliver O''Brien), og tomme celler bliver NULL. Dette værktøj udfører den konvertering på hele din CSV-fil, helt i din browser.

Hvad er dette værktøj?

At seede en testdatabase, indlæse en regneark-eksport i en tabel eller migrere et lille datasæt starter ofte på samme måde: du har en CSV-fil og har brug for SQL. Dette værktøj parser din CSV (bruger header-rækken som kolonnenavne) og bygger én INSERT INTO-sætning, der dækker hver datarække, klar til at indsætte i en database-klient.

Streng-værdier pakkes ind i enkelte anførselstegn med interne anførselstegn escaped ved at fordoble dem (så O'Brien bliver O''Brien), hvilket er den standard escape-regel, der deles af MySQL, PostgreSQL og SQLite. En tom CSV-celle skrives som SQL-nøgleordet NULL i stedet for en tom streng — det er et bevidst valg, da en blank celle i et regneark som regel betyder "ingen værdi" frem for "et tomt stykke tekst", og NULL er hvad de fleste skemaer forventer for det.

Om en værdi får anførselstegn eller ej afgøres af en simpel heuristik, ikke rigtig typeinferens: hvis den trimmede celle ligner et rent heltal eller decimaltal (evt. med et foranstillet minustegn), skrives den uden anførselstegn; alt andet — inklusive ting der blot minder om tal med ekstra tegn, som telefonnumre eller postnumre med foranstillede nuller — sættes i anførselstegn som en streng. Det holder outputtet ærligt: det er et godt udgangspunkt for en lille import, ikke en erstatning for at validere dine data mod dit faktiske tabelskema, før du kører det.

Kilde: CSV-parsing følger RFC 4180, det tætteste på en formel CSV-standard; fordobling af enkelte anførselstegn til streng-escaping er den fælles konvention dokumenteret af MySQL, PostgreSQL og SQLite.

Hvorfor bruge det?

  • Brugerdefineret tabelnavn — sæt målt tabellen én gang, og hver række sigter mod den tabel.
  • Korrekt streng-escaping — enkelte anførselstegn inde i værdier fordobles, så SQL'en ikke går i stykker eller bliver afkortet.
  • Forudsigelig NULL-håndtering — tomme celler bliver NULL i stedet for en tom streng, hvilket matcher hvordan de fleste databaser skelner manglende data.
  • Almindelig SQL-syntaks — INSERT INTO ... VALUES ...-formen genereret her virker uændret i MySQL, PostgreSQL og SQLite.
  • 100% client-side — dine CSV-data (som kan indeholde kundeoplysninger eller forretningsdata) parses og konverteres i din browser og bliver aldrig uploadet nogen steder.

Sådan bruger du det

  1. Indsæt CSV-data med en header-række, f.eks. name,age\nAlice,30\nBob,25.
  2. Indtast måltabellens navn (standard er my_table).
  3. Klik "Generate SQL".
  4. Kopiér INSERT INTO-sætningen eller download den som en .sql-fil, og kør den derefter mod din database.

Eksempel

Input

name,age,city
Alice,30,
Bob,,NYC

Output

INSERT INTO `my_table` (`name`, `age`, `city`)
VALUES
  ('Alice', 30, NULL),
  ('Bob', NULL, 'NYC');

Læg mærke til at de tomme celler blev til NULL (ikke tomme strenge), og den taleagtige alder-værdi 30 blev efterladt uden anførselstegn, mens hver tekstværdi fik anførselstegn.

Praktiske tips

  • Seede en lokal testdatabase: eksportér en lille stikprøve som CSV fra et regneark, konvertér den her, og kør INSERT-sætningen mod din udviklingsdatabase.
  • Tjek altid kolonnetyper, før du kører den genererede SQL mod en rigtig tabel — dette værktøj gætter numerisk vs. tekst med en simpel heuristik, ikke dit faktiske skema, så en heltalskolonne, der forventer et bestemt format, kan kræve manuel justering.
  • Hvis du har tusindvis af rækker, er den enkelte multi-række INSERT-sætning, dette værktøj genererer, stadig gyldig SQL, men meget store sætninger kan ramme en databases maksimale pakkestørrelse — split CSV'en i mindre batches først, hvis du støder på den grænse.

Hvorfor NULL og ikke en tom streng

En almindelig fejl, når man håndskriver CSV-til-SQL-scripts, er at behandle hver manglende celle som en tom streng ''. Det er teknisk gyldig SQL, men det betyder som regel ikke det, man ønsker: en kolonne defineret som et heltal vil afvise '' direkte, og selv i en tekstkolonne betyder '' i de fleste skemadesigns og rapporteringsforespørgsler stiltiende noget andet end "vi kender ikke den værdi" (et WHERE column IS NULL-tjek matcher ikke tomme strenge, og omvendt). At bruge NULL til tomme celler matcher den semantik, de fleste databaser og ORM'er forventer, og det undgår typefejl, når en numerisk kolonne tilfældigvis mangler værdier i nogle rækker.

Ofte stillede spørgsmål

Virker dette med alle SQL-databaser?

Den genererede syntaks — backtick-citerede identifikatorer, enkelt-citerede streng-værdier, standard INSERT INTO ... VALUES ... — er fælles for MySQL, PostgreSQL og SQLite. PostgreSQL kræver strengt taget ikke backticks omkring identifikatorer (den bruger dobbelte anførselstegn, hvis citering overhovedet er nødvendig), men backtick-citerede navne er også harmløse der, så længe du ikke har usædvanlige kolonnenavne, der kolliderer med reserverede ord. Der følges ingen enkelt officiel SQL-standard her — bare den syntaks, der virker uændret på tværs af de mest almindelige databaser.

Hvorfor bliver en tom celle til NULL i stedet for en tom streng ''?

Dette er et bevidst designvalg: i de fleste virkelige CSV-eksporter betyder en blank celle, at værdien er ukendt eller ikke relevant, ikke bogstaveligt et tomt stykke tekst. NULL er hvad de fleste databaseskemaer forventer for det. Hvis dit use case reelt har brug for tomme strenge i stedet, skal du redigere den genererede SQL manuelt for de tilfælde.

Hvordan afgør værktøjet, om en værdi skal have anførselstegn?

Det er en simpel heuristik, ikke rigtig typeinferens: hvis en trimmet celle kun består af cifre (med et valgfrit foranstillet minus og højst ét decimalpunktum), skrives den uden anførselstegn som et tal. Alt andet sættes i anførselstegn som en streng. Det betyder, at et postnummer som 00501 eller et telefonnummer vil blive behandlet som tekst (da det kun fejler det strenge heltalsmønster, hvis det har ekstra tegn — et foranstillet nul alene parses stadig som numerisk her, så dobbelttjek identifikatorer som postnumre og id'er før du kører SQL'en).

Bliver mine data uploadet nogen steder?

Nej. Både parsing og SQL-generering foregår i JavaScript i din browser — intet sendes til en server, hvilket gør det sikkert at bruge med eksporterede kunde- eller forretningsdata.

Kan den håndtere CSV-værdier, der indeholder kommaer eller anførselstegn?

Ja. CSV'en parses med en rigtig parser til citerede felter, der forstår kommaer, linjeskift og fordoblede anførselstegn inde i citerede felter — ikke en naiv opdeling på kommaer — så et felt som "Smith, John" læses som én værdi, ikke splittet i to kolonner.

Relaterede værktøjer