CSV-st JSON-iks: Tekst tabelist struktuuri
CSV- ja JSON-vormingud teenivad andmevahetuses eri otstarbeid. CSV on lihtne tabel, kus iga rida on tekstirida ja veerud eraldatud komade, semikoolonite või tabeldusmärkidega. JSON seevastu võimaldab pesastatud struktuure ning selgelt eristatud andmetüüpe (number, tõeväärtus, null, string). Kui vajad CSV-failist JSON-massivi, kus iga rida muutub üheks objektiks ja iga veerg võtmeks, siis see leht teeb seda otse brauseris – ilma üleslaadimiseta serverisse.
Mis teeb selle teisenduse teistsuguseks
CSV → JSON pole lihtsalt vorminguvahetus. See on üleminek täielikult tüpiseerimata maailmast struktuursesse, kuid siin on kolm olulist aspekti, mida paljud kasutajad esimese hooga ei märka.
Tüübid ei kandu üle. CSV salvestab kõik väljad tekstina. JSON toetab numbreid, tõeväärtusi ja null-väärtusi, aga tööriist ei proovi neid automaatselt tuvastada. Kui CSV-s on "1234" (näiteks postiindeks või tootekood), jääb see JSON-is stringiks "1234". Kui hiljem laadid selle JSON-i keskkonda, mis automaatselt tüüpe määrab (näiteks JavaScripti JSON.parse koos reviver-funktsioonita), võivad eesliidete nullid kaduda. See on teadlik valik: tööriist ei oleta, kas väärtus on number või tekst, vaid säilitab originaali.
Pesastamine puudub. CSV on rangelt lame tabel. Iga rida annab ühe objektiga taseme. JSON-objekte ei saa selle tööriistaga omavahel pesastada – näiteks ei muuda sa ühte CSV-ridu alamobjektideks ega loo mitmetasandilist struktuuri. Kui vajad hierarhilist JSON-i, pead selle hiljem ise ehitama või kasutama mõnda muud meetodit. (Huvitav, et vastupidine teisendus – JSON → CSV – peab pesastatud väljad lamedaks tegema, mis on keerulisem.)
Eraldaja valik on kriitiline. CSV ei tähenda alati komasid. Paljud süsteemid (nt Exceli Euroopa lokaat) kasutavad semikoolonit. Ka tabeldusmärk on levinud. Sellel lehel pead ise määrama, kas faili eraldaja on koma, semikoolon või tabulaator – erinevalt JSON- või Exceli-sisenditest, kus sellist valikut pole. Kui eraldaja on vale, ei saa tööriist ridu korralikult tükeldada ja kuvab veateate.
Komade ja reavahetuste tsiteerimine on habras. CSV standard (RFC 4180) soovitab jutumärkides väärtustesse peidetud komasid ja reavahetusi erimärkidena käsitleda. Praktikas aga ei järgi kõik failid seda reeglit. Kui näiteks ühes lahtris on jutumärk sees ilma korraliku paospõgenemiseta või reavahetus ilma kogu lahtrit tsiteerimata, ebaõnnestub sõelumine. See on CSV → JSON teisenduses palju sagedasem probleem kui vastupidises suunas või Exceli-failide puhul.
Kuidas tööriist tegelikult töötab
Protsess on sirgjooneline, kuid pealtnäha lihtne samm sisaldab mõnda otsustuskohta.
-
Faili valimine ja tuvastus. Sa lohistad CSV-faili lehele või klõpsad valimiseks. Tööriist vaatab faililaiendit ja sisu – kui tegemist on JSON- või XLSX-failiga, tõlgendab ta seda samuti tabelina, kuid selle lehe põhistsenaarium on CSV → JSON. Kui tuvastus ebaõnnestub, saad teate: „Choose a CSV, JSON or XLSX file.“
-
Väljundvormingu määramine. Pead valima „JSON“ (võimalik on ka „CSV“ ja „XML“, kuid siin eeldame JSON-i). Seejärel, kui sisend on CSV, palutakse valida eraldaja: koma, semikoolon või tabulaator.
-
Sõelumine. Tööriist loeb faili rea haaval, tükeldab rea eraldaja järgi, arvestades tsiteeritud välju. Iga rida muutub objektiks, kus võtmeteks on esimese rea veerupäised (kui need on olemas). Kui päiseid pole, kasutatakse vaikevõtmeid (nt
column0,column1). -
Tulemuse eelvaade ja allalaadimine. Pärast teisendust näed eelvaadet: mitu rida ja veergu, väljundfaili suurus ning JSON-i struktuur. Saad selle kohe alla laadida.
Tüüpide puudumine: miks kõik jääb tekstiks
CSV-vormingul pole andmetüüpide süsteemi. Iga väli on lihtsalt märgijada. Seetõttu teisendab tööriist kõik väljad stringideks. See tähendab, et:
- Number
1.5CSV-s jääb JSON-is stringiks"1.5". - Tõeväärtus
TRUEjääb stringiks"TRUE", mitte tõeseks booleaniks. - Tühi väli CSV-s muutub tühjaks stringiks
"", mittenull-iks. - Kuupäev
2023-01-15jääb tekstiks.
Kui vajad JSON-is numbreid või tõeväärtusi, pead need hiljem ise teisendama (nt JavaScripti Number(), Boolean() või mõne andmetöötlusraamistiku abil). See on teadlik disainiotsus: tööriist ei sea ohtu andmete täpsust, oletades tüüpe. Eriti oluline on see eesliidete nullide puhul – postiindeksid, tootekoodid, isikukoodid jne. Kui tööriist teisendaks need numbriteks, kaoks eesolev null. Seetõttu säilitatakse kõik stringidena.
Mõned JSON-parserid (nt JavaScripti JSON.parse ilma reviverita) teisendavad igal juhul numbrilise välimusega stringe automaatselt – seda tuleb arvestada, kui laed saadud JSON-i otse rakendusse. Tööriist ise seda ei tee.
Eraldaja valik ja tsiteerimise reeglid
Eraldaja valik on lihtne, aga vale valik annab segase tulemuse. Tööriist toetab kolme eraldajat:
| Eraldaja | Märk | Levinud kasutus |
|---|---|---|
| Koma | , |
Standardne ingliskeelne CSV |
| Semikoolon | ; |
Euroopa lokaat, Exceli vaikimisi |
| Tabulaator | \t |
Andmebaaside ekspordid, UNIX-tööriistad |
Kui su fail on loodud Excelis ja salvestatud „CSV (komaeraldusega)“, kuid su Excel kasutab semikoolonit (sõltuvalt keeleseadetest), võib tulemus olla üks veerg. Vea korral näed teadet „This CSV could not be parsed.“
Tsiteerimise reeglid (RFC 4180) ütlevad, et kui väärtus sisaldab eraldajat, reavahetust või jutumärki, tuleb see panna jutumärkidesse ja jutumärgid kahekordistada. Näiteks: "Mees, naine ja lapsed", 123 on korrektne, kus esimene väli on Mees, naine ja lapsed. Kui jutumärke pole, tõlgendab tööriist koma eraldajana ja rea veergude arv läheb paigast ära. Samuti võib reavahetus jutumärkideta lahtris lõhkuda rea struktuuri – tööriist eeldab, et üks rida CSV-s on üks andmerida. Kui sees on reavahetus, siis tsiteerimata lahtri korral loetakse see uue rea alguseks, mis põhjustab veateate. Tööriist aga säilitab jutumärkide sees olevad reavahetused kui \n stringides.
Miks CSV-st ei saa hierarhilist JSON-i
CSV on lame tabel: igal real on sama arv veerge (või peaks olema). JSON võib olla massiiv objektidest, kus igal objektil on samad võtmed – see ongi „tabelikujuline“ JSON, mida see tööriist toodab. Suurem pesastus pole võimalik, sest CSV-s pole viisi, kuidas ütleda, et üks väli on teise objekti all. Näiteks kui sul on andmed klientide ja nende tellimuste kohta, peab kumbki tabel olema eraldi CSV-fail. Tööriist ei saa neid kombineerida. See on põhimõtteline piirang.
Samas on see ka lihtsustus: sa ei pea muretsema, et JSON-i struktuur muutub sõltuvalt sisendist. Iga objekt on sama kujuga, mis teeb edasise töötlemise prognoositavaks.
Veateated ja piirangud
Tööriist annab selged sõnumid, kui midagi läheb valesti. Kõik veateated põhinevad faktilehel toodud tekstidel.
- Faili valimata: „Choose one file first.“
- Vale failitüüp: „Choose a CSV, JSON or XLSX file.“
- CSV sõelumise viga: „This CSV could not be parsed.“ (nt tsiteerimise probleem või ebajärjekindlad veerud)
- Andmeridu pole: „This file has no table rows.“
- Liiga palju ridu: „This table has more than ‹max› rows.“ (täpne piir pole faktilehel toodud, kuid see on olemas)
- Liiga palju veerge: „This table has more than ‹max› columns.“
- Fail liiga suur: „This file is too large. Use a file under ‹max›.“
- Aegumine: „This conversion is taking too long. Try a smaller file.“
Need piirangud on reaalsed – nad eksisteerivad, et tagada brauseri jõudlus, kuna teisendus toimub kliendipoolselt. Kui su fail on tohutu, võid selle eelnevalt tükeldada.
Kes seda tööriista vajab
- Arendaja, kes saab andmebaasist CSV-ekspordi ja peab selle söötma JavaScripti API-sse, mis ootab JSON-i. Ta ei taha kirjutada ise parserit ega laadida andmeid serverisse.
- Andmeanalüütik, kes teisendab vanu CSV-aadressifaile (eesliidete nullidega postiindeksid) JSON-i, säilitades nullid. Tavalised JSON-teegid eemaldaksid need, kui tüüp automaatselt määratakse; siin jäävad alles.
- Meeskond, kus mittetehniline kolleeg töötab Exceli/CSV-ga ja tehniline pool vajab JSON-i – ja tundlikke andmeid ei tohi serverisse üles laadida. See tööriist töötab täielikult brauseris.
- Õpilane või teadlane, kes vajab ühekordset teisendust lihtsast tabelist programmeerimisülesande jaoks.
- Igaüks, kes koostab lihtsat toodete, kontaktide või logide tabelit veebirakendusele, mis loeb JSON-i.
KKK (Korduma Kippuvad Küsimused)
1. Kas tööriist teisendab numbrid automaatselt? Ei. Kõik CSV väljad jäävad JSON-is stringideks. Numbrid ja tõeväärtused pead ise teisendama peale allalaadimist.
2. Miks kaovad eesliide nullid, kui ma JSON-i oma programmis laen?
Tööriist ise ei eemalda nulle. Kui aga sinu keskkond (nt JavaScripti JSON.parse) teisendab numbrilise stringi automaatselt numbriks, kaovad nullid. Selle vältimiseks kasuta reviver-funktsiooni, mis jätab teatud võtmed stringideks.
3. Kas ma saan teisendada CSV-d, kus on reavahetus lahtri sees? Jah, kui lahtri sisu on korralikult jutumärkides. Vastasel juhul tõlgendatakse reavahetust uue rea algusena ja teisendus ebaõnnestub.
4. Mis juhtub, kui CSV-s on erinev arv veerge eri ridadel? Tööriist eeldab, et kõigil ridadel on sama arv veerge. Kui erinevus on suur, kuvatakse „This CSV could not be parsed.“ Mõnel juhul võib tööriist siiski tulemuse anda, aga mõned read jäävad vigaseks.
5. Kas ma saan kasutada seda tööriista ka XLSX → JSON teisenduseks? Jah, tööriist tuvastab XLSX-failid ja tõlgendab neid tabelina, kuid põhistsenaarium on CSV → JSON. XLSX-failide puhul pole eraldaja valikut vaja.
6. Kui suur võib fail olla? Tööriistal on failimahu piirang, mis kuvatakse veateates. Täpne number sõltub brauseri võimekusest, aga üldiselt on soovitatav kasutada faile mõne megabaidi suuruses. Liiga suur fail annab teate „This file is too large. Use a file under ‹max›.“