CSV forælder-barn-hierarki: skabelon (nedbrydning af produktkatalog)
En PIM- eller styklisteeksport navngiver hver rækkes forælder, så dens pile peger opad. Kolonnen Linje til navngiver børn, så de peger nedad. Skabelonen her er den ombytning tegnet ud: fem dybdeniveauer, fem beslutninger, syv blade.
Hvad er CSV forælder-barn-hierarki: skabelon (nedbrydning af produktkatalog)?
En katalogeksport og en stykliste ankommer i den samme form. Én række pr. vare, en id-kolonne, en navnekolonne og en kolonne, der navngiver rækkens forælder: parent_id, parent_sku, belongs_to, hvad end det system, der skrev filen, tilfældigvis kalder den. Hierarkiet er der alt sammen. Det er blot gemt vendt den forkerte vej til et diagram: hver række navngiver den ene række over sig, og ingen række nogen steder navngiver rækkerne under sig. Det er det rigtige design til en database, hvor en celle rummer én værdi og aldrig en liste, og det forkerte til et diagram, hvor en pil forlader en forælder og ankommer til et barn. Det er heller ikke en fil, du har bygget. En CSV er det, der kommer ud af et system, allerede fladet ud: ingen formler tilbage til at genberegne opslaget for dig, intet andet faneblad med varianttabellen, ingen farvekodning der siger, hvilke rækker der var færdigvarer.
QueryCharts regneark gemmer den modsatte relation. Linje til rummer de rækker, denne række peger på (dens børn) som en kommaadskilt liste af rækkenumre, og Linjetekst rummer etiketterne på forbindelserne i samme rækkefølge. Oversættelsen er altså én ombytning, foretaget én gang. Gruppér eksporten efter dens forælderkolonne, og hver gruppe bliver til værdien i Linje til på den række, den navngiver. En forælder med fire børn ender med fire tal i én enkelt celle; hvert barn ender med intet i sit eget Linje til og med sin placering talt med i forælderens. De rækker, hvis forældercelle er tom, er rødderne, og du vil have præcis én af dem: tre tomme forældre er tre træer, og tre træer er tre diagrammer.
To ting snyder folk. Linje til rummer placeringer og ikke identifikatorer: værdien er rækkens nummer i arket, så en forælder på SKU-1042 skal slås op til nummeret på den række, der bærer den kode, og at indsætte én række omnummererer alt nedenunder. Et tal, der ikke navngiver nogen række, bliver droppet, når diagrammet tegnes, og intet fortæller dig det. Den anden er, at dybde ikke er en kolonne: du får den ved at følge forælderkæden opad, indtil du når en tom, og det er derfor, den samme slags post kan ligge på forskellige dybder i forskellige grene af den samme fil. Diagrammet herunder er et lille katalog over havemøbler tegnet præcis sådan: nitten rækker fordelt på fem dybdekolonner og fire postbaner, én rod, syv blade og fem beslutninger på de punkter, hvor et katalog reelt forgrener sig: om en kategori har flere underniveauer, om et produkt bærer variantrækker, om en vare er lagerført eller fremstillet efter ordre, og om en komponent er købt hjem eller fremstillet selv.
Hvad dette flowchart dækker
I denne skabelon
- Fem dybdekolonner ("Rod (forælder tom)" og Dybde 1 til Dybde 4) krydset med fire postbaner: "Kategoripost", "Produktpost", "Variantpost" og "Komponentpost", så eksportens typekolonne bliver til en position på siden, mens forælderkæden bliver til kolonnen.
- Én enkelt rod, "Katalog for udeliv", som i filen er den eneste række, hvis forældercelle er tom, og som breder sig ud i de to kategorier på dybde 1, "Siddemøbler" og "Skygge og læ".
- Grunden til, at dybde og posttype aldrig helt følges ad: "Har kategorien flere underniveauer?" skiller en indlejret underkategori fra "Hyndesæt til bænk", et salgbart produkt der ligger på samme dybde som en kategori, så "Havebænk 3 personer" ender et niveau lavere end "Hængeparasol 3 m", selv om begge er produkter.
- "Har produktet varianter?" besvaret, som filen besvarer det: ja giver "Hyndesæt, natur", en variantrække der bærer den bestilbare kode, og nej giver "Hyndesæt til bænk, ét varenummer", hvor produktrækken er den salgbare række og slet ingen børn har.
- Styklistegrenen, der kun kan nås gennem "Lagerført eller fremstillet efter ordre?": en lagerført vare ender ved "Havebænk 3 personer, eg", mens en vare fremstillet efter ordre fortsætter ind i "Købt hjem eller fremstillet selv?" og ned til "Lægtesæt i hårdttræ" og "Bænkestel i støbejern".
- Syv bladrækker, hver af dem en række med en tom celle i Linje til, adskilt efter figur frem for efter dybde: salgbare blade som "Erstatningsdug 3 m" over for interne som "Ribbesamling til parasol", og det er dét, "Sælges reservedelen særskilt?" afgør.
Hvornår du skal bruge skabelonen
- Nogen har sendt dig en katalogeksport (en CSV ud af et PIM, et ERP eller en webshops administration) og spurgt, hvad sortimentet faktisk indeholder.
- En stykliste løber op i flere hundrede linjer, og ingen kan se, hvilke færdigvarer én komponent når frem til, uden at filtrere filen i hånden.
- To systemer er uenige om katalogets struktur, og du vil have de to eksporter tegnet som to træer frem for sammenlignet række for række i en diff.
- Eksporten indeholder forældreløse rækker, hvis forælder-id ikke optræder nogen steder i filen, og du skal finde dem, før hierarkiet indlæses i noget som helst andet.
- Du overdrager sortimentet til en leverandør, en auditor eller en ny medarbejder, og en søjle af id'er ved siden af en søjle af forælder-id'er er ikke noget, nogen kan læse.
Den CSV-fil, der giver dette diagram
Én række pr. trin. Tallene i Linje til er rækkenumre — det er dem, der tegner forbindelserne, og det er den kolonne, de fleste filer mangler.
| # | Figur | Bokstekst | Linje til | Linjetekst | Vandret bane | Lodret bane |
|---|---|---|---|---|---|---|
| 1 | Start | Katalog for udeliv | 2, 3 | Rod (forælder tom) | Kategoripost | |
| 2 | Process | Siddemøbler | 4 | Dybde 1 | Kategoripost | |
| 3 | Process | Skygge og læ | 7 | Dybde 1 | Kategoripost | |
| 4 | Decision | Har kategorien flere underniveauer? | 5, 6 | Underkategori, Salgbart produkt | Dybde 1 | Kategoripost |
| 5 | Process | Bænke | 10 | Dybde 2 | Kategoripost | |
| 6 | Process | Hyndesæt til bænk | 8 | Dybde 2 | Produktpost | |
| 7 | Process | Hængeparasol 3 m | 9 | Dybde 2 | Produktpost | |
| 8 | Decision | Har produktet varianter? | 11, 12 | Ja: én række pr. variant, Nej: produktrækken er varenummeret | Dybde 2 | Produktpost |
| 9 | Decision | Sælges reservedelen særskilt? | 13, 14 | Sælges særskilt, Kun til service | Dybde 2 | Produktpost |
| 10 | Process | Havebænk 3 personer | 15 | Dybde 3 | Produktpost | |
| 11 | Success | Hyndesæt, natur | Dybde 3 | Variantpost | ||
| 12 | Success | Hyndesæt til bænk, ét varenummer | Dybde 3 | Produktpost | ||
| 13 | Success | Erstatningsdug 3 m | Dybde 3 | Variantpost | ||
| 14 | End | Ribbesamling til parasol | Dybde 3 | Komponentpost | ||
| 15 | Decision | Lagerført eller fremstillet efter ordre? | 17, 16 | Lagerført, Fremstillet efter ordre | Dybde 3 | Produktpost |
| 16 | Decision | Købt hjem eller fremstillet selv? | 18, 19 | Købt hjem, Fremstillet selv | Dybde 3 | Komponentpost |
| 17 | Success | Havebænk 3 personer, eg | Dybde 4 | Variantpost | ||
| 18 | End | Lægtesæt i hårdttræ | Dybde 4 | Komponentpost | ||
| 19 | End | Bænkestel i støbejern | Dybde 4 | Komponentpost |
#,Figur,Bokstekst,Linje til,Linjetekst,Vandret bane,Lodret bane
1,Start,Katalog for udeliv,"2, 3",,Rod (forælder tom),Kategoripost
2,Process,Siddemøbler,4,,Dybde 1,Kategoripost
3,Process,Skygge og læ,7,,Dybde 1,Kategoripost
4,Decision,Har kategorien flere underniveauer?,"5, 6","Underkategori, Salgbart produkt",Dybde 1,Kategoripost
5,Process,Bænke,10,,Dybde 2,Kategoripost
6,Process,Hyndesæt til bænk,8,,Dybde 2,Produktpost
7,Process,Hængeparasol 3 m,9,,Dybde 2,Produktpost
8,Decision,Har produktet varianter?,"11, 12","Ja: én række pr. variant, Nej: produktrækken er varenummeret",Dybde 2,Produktpost
9,Decision,Sælges reservedelen særskilt?,"13, 14","Sælges særskilt, Kun til service",Dybde 2,Produktpost
10,Process,Havebænk 3 personer,15,,Dybde 3,Produktpost
11,Success,"Hyndesæt, natur",,,Dybde 3,Variantpost
12,Success,"Hyndesæt til bænk, ét varenummer",,,Dybde 3,Produktpost
13,Success,Erstatningsdug 3 m,,,Dybde 3,Variantpost
14,End,Ribbesamling til parasol,,,Dybde 3,Komponentpost
15,Decision,Lagerført eller fremstillet efter ordre?,"17, 16","Lagerført, Fremstillet efter ordre",Dybde 3,Produktpost
16,Decision,Købt hjem eller fremstillet selv?,"18, 19","Købt hjem, Fremstillet selv",Dybde 3,Komponentpost
17,Success,"Havebænk 3 personer, eg",,,Dybde 4,Variantpost
18,End,Lægtesæt i hårdttræ,,,Dybde 4,Komponentpost
19,End,Bænkestel i støbejern,,,Dybde 4,KomponentpostSådan fungerer det
Find de to kolonner, der bærer hierarkiet
Alt andet i eksporten er pynt i denne sammenhæng. Du skal bruge den kolonne, der rummer hver rækkes egen identifikator, og den kolonne, der navngiver dens forælder. De hedder sjældent id og parent_id: se efter parent_sku, belongs_to, category_path eller assembly. Er forælderen en sti frem for en kode, som Hjem > Siddemøbler > Bænke, er det sidste led forælderen, og resten er dybden. Har eksporten slet ingen forælderkolonne, men et niveaunummer, så se bemærkningen om indrykkede styklister længere nede.
Vend forælderkolonnen om til Linje til
Det er hele arbejdet. Sortér eller gruppér eksporten efter dens forælderkolonne, så hver forælders børn ligger samlet, og skriv så de børns rækkenumre ind i forælderens celle i Linje til, adskilt af kommaer. Retningen vender her: eksporten sagde barn navngiver forælder, arket siger forælder navngiver børn. Én følge er værd at sige højt: forælderkolonnen har én værdi pr. række, og Linje til har lige så mange værdier, som den række har børn, så informationen flytter fra mange rækker over på færre.
Nummerér rækkerne til sidst, og først når rækkefølgen er endelig
Linje til rummer rækkens placering i arket og ikke dens identifikator, så SKU-1042 skal blive til nummeret på den række, der bærer den. Indsæt en række bagefter, og hvert tal under indsættelsespunktet er nu forskudt med én. Få rækkerne på deres endelige plads først, og slå så id'erne op til numre i én omgang. En værdi i Linje til, der navngiver en række, som ikke findes, bliver droppet i stilhed, når diagrammet tegnes, og det ser ud som en kasse, der ganske enkelt glemte at forbinde sig til noget.
Sæt cellen i Linje til i anførselstegn, og bekræft feltadskilleren
Linje til og Linjetekst rummer kommaadskilte lister, så i en kommaadskilt fil skal de celler omsluttes af dobbelte anførselstegn ("4,5" og "Ja,Nej"), ellers får rækken et felt for meget, og hver kolonne efter den forskyder sig ét til venstre. Europæiske eksporter er ofte semikolonadskilte, hvilket gør kommaer inde i celler harmløse, men betyder, at hele filen skal læses som semikolonadskilt. Produktnavne har deres egne problemer med anførselstegn: et komma i Bænk, 3 personer eller et tommemærke i en 3" stang skal undtages på samme måde. Ser en kolonne ud til at blive ignoreret ved import, så se på den første overskrift, for en fil skrevet som UTF-8 med et byteordensmærke bærer tre usynlige bytes foran den.
Sæt Figur ud fra, hvad rækken er, og Vandret og Lodret bane ud fra, hvor den ligger
Én række får Start: den med den tomme forælder. Rækker med et tomt Linje til er blade, og et blad har brug for en slutfigur (Slut, Succes eller Afvist), for en række, der ikke er en afslutning og ikke har nogen udgående forbindelse, er en blindgyde. Brug den opdeling, denne skabelon bruger, hvis det hjælper: Succes til rækker, en kunde kan bestille, og Slut til rækker, der kun findes inde i en samling. Udfyld derefter Vandret bane med den dybde, du gik dig frem til, og Lodret bane med eksportens egen typekolonne. Et figurnavn, der ikke genkendes, normaliseres til Proces uden at klage, så kontrollér især stavningen af Beslutning.
Ryd forældreløse rækker, ekstra rødder og sløjfer, før du importerer
Tre kontroller, hver med sit eget symptom. Hver værdi i forælderkolonnen skal optræde i id-kolonnen; de, der ikke gør, er forældreløse, som regel fordi eksporten blev filtreret til én kategori, mens forældrene ligger over den. Præcis én række bør have en tom forælder, og har flere det, ser du på flere træer. Og ingen række må nå sig selv gennem sine forældre, hvilket sker efter en dårlig sammenfletning og, når det først er vendt om, tegner en forbindelse, der løber tilbage i sig selv.
Ofte stillede spørgsmål
Hvordan laver man en forælder- og barnkolonne om til et flowchart?
Ved at vende relationen om og derefter nummerere den. Eksporten giver dig barn navngiver forælder; arket vil have forælder navngiver børn. Gruppér rækkerne efter forælderkolonnen, og skriv for hver forælder dens børns rækkenumre ind i den forælders celle i Linje til, adskilt af kommaer. Hver række, hvis forældercelle er tom, er en rod og får figuren Start; hver række, der ikke optræder i nogens forælderkolonne, er et blad, får et tomt Linje til og får en slutfigur. Udfyld Bokstekst fra navnekolonnen, Vandret bane fra den dybde, du får ved at følge forælderkæden, og Lodret bane fra den typekolonne, eksporten allerede har. Træk derefter .csv-filen over på editorens regnearksområde, eller indsæt CSV-teksten direkte i det. Importen matcher på overskrifter, så kolonnernes rækkefølge i din fil er uden betydning, og kolonner, den ikke genkender, tages med og ignoreres.
Hvad er forskellen på en forælderkolonne og en kolonne Linje til?
Retning, antal og hvad værdien henviser til. En forælderkolonne peger opad: hver række navngiver den ene række over sig, så der er præcis én værdi pr. række, og blade er de rækker, ingen navngiver. En kolonne Linje til peger nedad: hver række navngiver rækkerne under sig, så en forælder med fire børn rummer fire værdier i én celle, og blade er de rækker, hvis celle er tom. Og værdierne er forskellige af art. En forælderkolonne rummer en identifikator, noget i retning af SKU-1042, som følger rækken, hvor end den flytter hen. Linje til rummer en placering, rækkens 1-baserede nummer i arket, som ændrer sig i det øjeblik, en række indsættes over den. Det er derfor, identifikatorerne skal slås op til numre, efter at rækkefølgen ligger fast, frem for før.
Mine kolonner forskød sig midtvejs i filen. Hvad skete der?
Næsten altid et komma uden anførselstegn. En CSV-række deles på feltadskilleren, før noget som helst andet ser på den, så en celle i Linje til med 4,5 i en kommaadskilt fil læses som to felter, rækken ender ét felt længere end overskriften, og hver kolonne efter Linje til lander under naboens overskrift. Omslut de celler med dobbelte anførselstegn, så sætter læseren dem sammen igen. Det samme gælder Linjetekst, som også er en kommaadskilt liste, og ethvert produktnavn med et komma i. Begynder forskydningen derimod ved den allerførste kolonne, er årsagen som regel det modsatte problem: filen er semikolonadskilt, som de fleste europæiske systemeksporter er, og bliver læst som kommaadskilt, eller et tegnsætsmisforhold har hængt et byteordensmærke på den første overskrift, så den ikke længere matcher.
Hvad sker der med en række, hvis forælder mangler i eksporten?
Den bliver forældreløs, og det er den mest almindelige fejl i en filtreret eksport. Du bad systemet om én kategori, eller kun om aktive varer, og det gav dig præcis de rækker, inklusive deres forælder-id'er, som peger på rækker, filteret udelod. Intet i filen er markeret som forkert. Når hierarkiet vendes om, bliver den række ganske enkelt aldrig nævnt i nogens Linje til, så den tegnes som en kasse, hvor intet ankommer, og som ligger uden for træet. Beslut pr. række, hvad der er tale om, før du importerer: en række, hvis forælder blev filtreret fra, bør knyttes til den nærmeste medtagne forfader, og en række, hvis forælder ikke længere findes i kildesystemet, er en datafejl, der skal meldes tilbage frem for tegnes.
Kan jeg bruge en stykliste med en niveaukolonne i stedet for en forælderkolonne?
Ja, og den konverteres til det samme, men konverteringen afhænger af rækkefølgen frem for af nogen værdi i rækken. En indrykket stykliste gentager niveauerne 1, 2, 2, 3, 1 ned gennem filen, og reglen er, at en rækkes forælder er den nærmeste række over den, hvis niveau er præcis ét lavere. Det betyder, at eksportens oprindelige rækkefølge er bærende: sortér filen efter varenummer først, og hierarkiet er væk, uden en fejl og uden noget tilbage at genskabe det fra. Gå filen igennem fra top til bund, hold styr på den senest sete række på hvert niveau, tildel forældre undervejs, og vend først derefter om til Linje til. Antal, enheder og leverandørkoder kan blive, hvor de er, i deres egne kolonner, som tages med gennem importen og ignoreres, eller flytte over i kolonnen Noter, hvis du vil have dem synlige.
