Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Best gaming laptop?

Humane (2024)

Recomandare casti 100-150 lei

Schimbare bec far VW Touran 1T3
 Plata impozit PF

Ce parere aveti de viteza/ modul ...

Love Lies Bleeding - 2024

Cum sterg mails din Promotions
 Vanzare cumparare fara transfer b...

Receptie ciudata, in functie de t...

Donez medicamente renale ptr pisica

Ce componenta e asta si ce ziceti...
 Dupa 20 ani de facultate, am uita...

Mobile.de ofera imprumut de bani ...

problema test grila

Digi24 a disparut de pe TV Lg
 

ETL one to many relationship from CSV to XML

* - - - - 1 votes
  • Please log in to reply
31 replies to this topic

#1
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Înscris: 06.03.2005
Salut

Nu stiu daca am postat unde trebuie, dar administratorul se poate ocupa de asta.

Se da un proces de ETL unde se doreste transformarea unui esantion de date (miliions) in format XML (validat de o schema XSD) care poate ajunge la 500MB-600MB.

Plecand de la formatul dorit (pentru evidentiere -> reported car contine mult mai multe informatii decat model si year - inca vreo 10-12 tag-uri):

<?xml version="1.0" encoding="UTF-8"?>
<dataBody xmlns="urn:ro:test:car:report:v1" xmlns:ns2="urn:ro:test:car:report:commontypes:v1" version="4.0">
<reported Id="1">
	 <Name>John</Name>
	 <Address>
		 <Country>RO</Country>
		 <AddressFree>The complete address</AddressFree>
	 </Address>
	 <reportedCar>
		 <model>Dacia</model>
		 <year>2021</year>
	 </reportedCar>
	 <reportedCar>
		 <model>Audi</model>
		 <year>2023</year>
	 </reportedCar>
</reportedId>
<reported Id="2">
	 <Name>David</Name>
	 <Address>
		 <Country>AT</Country>
		 <AddressFree>The complete address</AddressFree>
	 </Address>
	 <reportedCar>
		 <model>Mercedes</model>
		 <year>2020</year>
	 </reportedCar>
	 <reportedCar>
		 <model>Ford</model>
		 <year>2021</year>
	 </reportedCar>
	 <reportedCar>
		 <model>Audi</model>
		 <year>2024</year>
	 </reportedCar>
</reportedId>
</dataBody>


as vrea sa definesc formatul fisierului (fisierelor?) de intrare CSV. Am plecat de la acest design, intr-un singur fisier:
Id|Name|Country|Address| reportedCarModel|year
1 John RO address	 Dacia	 2021
Audi	 2023
2 David AT address	 Mercedes	 2020
Ford	 2021
Audi	 2024


M-am mai gandit si la encapsularea datelor de pe primul nivel intr-un singur CSV:
Id|Name|Country|Address| reportedCarRef
1 John RO address	 Dacia [color=#ff0000]1[/color]


iar apoi referinta raportata in;
reportedCarRef|model|year
[color=#ff0000]1[/color]|Dacia|2021
[color=#ff0000]1[/color]|Audi|2023


Ar exista un design mai bun, in conditiile in care trebuie scris si Transformer-ul pentru convertire.

FAbian23

Edited by fabian23, 29 February 2024 - 13:11.


#2
PlatonX

PlatonX

    Senior Member

  • Grup: Senior Members
  • Posts: 5,741
  • Înscris: 13.09.2009
Intra CSV si iese XML?
Nu inteleg de ce se foloseste XML si nu JSON care ocupa mai putin.

Nu te juca cu array multidimensional ca dureaza o vesnicie sa il citeasca.
Citeste/scrie in Array1D.

Daca vrei viteza de procesare: CSV -> Array1D -> XML.
Daca vrei sa prelucrezi cantitate mare de date.

Dar tot nu inteleg de ce ai nevoie de CSV. Si de ce XML, este impus formatul?

Edited by PlatonX, 29 February 2024 - 13:30.


#3
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Înscris: 06.03.2005

View PostPlatonX, on 29 februarie 2024 - 13:30, said:

Intra CSV si iese XML?
Nu inteleg de ce se foloseste XML si nu JSON care ocupa mai putin.

Nu te juca cu array multidimensional ca dureaza o vesnicie sa il citeasca.
Citeste/scrie in Array1D.

Daca vrei viteza de procesare: CSV -> Array1D -> XML.
Daca vrei sa prelucrezi cantitate mare de date.

Dar tot nu inteleg de ce ai nevoie de CSV. Si de ce XML, este impus formatul?

Da, intra CSV si trebuie transformat in XML.

Formatul XML este impus. Am si spus ca este validat de o schema.

Feed-ul provine dintr-un DWH (Data Warehouse) si in principiu raportarile de acolo vin sub forma de CSV-uri. Nu se pot raporta direct in formatul XML amintit (din nestiinta, lipsa de timp, limitari tehnice- nu are importanta) de accea este nevoie de ETL.

Datele produse de DWH trebuie agregate si formatate intr-un mod inainte de a fi livrate ca date de intrare in ETL. CSV-ul este cel mai la indemana.

Edited by fabian23, 29 February 2024 - 14:00.


#4
PlatonX

PlatonX

    Senior Member

  • Grup: Senior Members
  • Posts: 5,741
  • Înscris: 13.09.2009
Poti sa iti faci o clasa CSV2XML si o structura Cars cu proprietatile Id|Name|Country|Address| reportedCarRef.
Clasa va avea o functie de citire ReadCSV si una de scriere WriteXML.

Cand se ca apela ReadCSV se va face o lista de structuri Cars: datele se duc din fisierul CSV in obiectul CSV2XML.
Cand se apeleaza WriteXML datele se duc din obiectul CSV2XML in fisierul XML.

Fisierul XML se poate scrie cu clasa separata oferita de limbajul de programare.

Edited by PlatonX, 29 February 2024 - 16:45.


#5
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Înscris: 06.03.2005

View PostPlatonX, on 29 februarie 2024 - 16:44, said:

Poti sa iti faci o clasa CSV2XML si o structura Cars cu proprietatile Id|Name|Country|Address| reportedCarRef.
Clasa va avea o functie de citire ReadCSV si una de scriere WriteXML.

Cand se ca apela ReadCSV se va face o lista de structuri Cars: datele se duc din fisierul CSV in obiectul CSV2XML.
Cand se apeleaza WriteXML datele se duc din obiectul CSV2XML in fisierul XML.

Fisierul XML se poate scrie cu clasa separata oferita de limbajul de programare.

Cred ca nu m-am facut inteles.

Desi principial este corect ce spui, la nivel de implementare pentru LIVE acesta se va face cu un EIP, foarte probabil Camel sau Batch.

Intrebarea mea era legata de arhitectura datelor de intrare. Cum ar fi mai bine ele sa fie organizate astfel incat implementarea sa fie cat mai apropiata de principiile SOLID mai ales Open-Closed principle si sa-ti faci viata cat mai usoara sa nu ajungi sa folosesti implementari XML low-level (linii de code multe) : memory performance issues, processing time, etc...

Edited by fabian23, 29 February 2024 - 18:15.


#6
PlatonX

PlatonX

    Senior Member

  • Grup: Senior Members
  • Posts: 5,741
  • Înscris: 13.09.2009
Eu as face in felul urmator:

As folosi 2 clase oferite de limbajul de programare, cred ca in cazul tu este PHP. Una pentru Excel si alta pentru XML. Cu clasa Excel faci conversie din CSV in xlsx si citesti apoi datele array 2D pe care il convertesti in Array1D. Acesta il procesezi.

Clasa XML va scrie datele in fisier.

Daca vrei abstractizare folosesti clase si obiecte daca vrei viteza de executie folosesti array 1D.

Eu nu stiu ce este gresit in ceea ce spun aici.

#7
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Înscris: 18.09.2020
Eu personal nu vad ce rost are sa iei date text si sa le bagi in excel ca apoi sa scoti din excel tot text.

#8
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Înscris: 18.09.2020
@fabian23,

Pe directia pe care ai inceput, ai putea sa scoti csv-urile din DWH cam asa:

main.csv
Id,Name,Country,Address,reportedCarsData
1,John,RO,address,1_CarsData.csv
2,David,AT,address,2_CarsData.csv
3,Helen,DE,address,3_CarsData.csv



1_CarsData.csv
reportedCarModel,year
Dacia,2021
Audi,2023



2_CarsData.csv
reportedCarModel,year
Mercedes,2020
Ford,2021



3_CarsData.csv
reportedCarModel,year
Porche,2024


Jobul tau ETL face parsing linie cu linie pe main.csv si pentru fiecare linie din main.csv parseaza tot linie cu line si fisierul cu numele mentionat in ultimul field a unei linii din main.csv ca sa scoata detaliile masinilor raportate si sa construieasca nodul/record-ul XML pentru ID-ul respectiv.

Asta presupune ca ETL-ul tau este un singur job care merge secvential/liniar pina cind termina de prelucrat toate liniile din main.csv si iti scoate un singur xml cu toate datele in el.




Daca faci csv-uri dedicate pentru fiecare Id in parte atunci ai putea sa rulezi mai multe job-uri ETL in paralel.
Fiecare job ETL apelat cu numele fisierului main.csv pe care sa-l proceseze.

ceva de genul:
   ./ETL.sh 1_main.csv
   ./ETL.sh 2_main.csv


In cazul acesta fisierele csv ar putea sa arate cam asa:

1_main.csv
Id,Name,Country,Address,reportedCarsData
1,John,RO,address,1_CarsData.csv


1_CarsData.csv
reportedCarModel,year
Dacia,2021
Audi,2023


2_main.csv
Id,Name,Country,Address,reportedCarsData
2,David,AT,address,2_CarsData.csv


2_CarsData.csv
reportedCarModel,year
Mercedes,2020
Ford,2021


3_main.csv
Id,Name,Country,Address,reportedCarsData
3,Helen,DE,address,3_CarsData.csv


3_CarsData.csv
reportedCarModel,year
Porche,2024



Daca prelucrezi datele alea in ceva cloud public (GCP sau AWS) atunci asta pare sa fie caz clasic de Cloud function sau Lambda function care este apelata pentru fiecare $Id_main.csv creat/salvat intr-un bucket sau de un mesaj impins intr-un queue.

Edited by cralin, 01 March 2024 - 01:58.


#9
PlatonX

PlatonX

    Senior Member

  • Grup: Senior Members
  • Posts: 5,741
  • Înscris: 13.09.2009

View Postcralin, on 01 martie 2024 - 00:02, said:

Eu personal nu vad ce rost are sa iei date text si sa le bagi in excel ca apoi sa scoti din excel tot text.
Din Excel scoti Array2D pe care il convertesti in Array1D. Poti face asta si cu explode pe string fara Excel.

#10
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Înscris: 06.03.2005

View Postcralin, on 01 martie 2024 - 01:53, said:

@fabian23,

Pe directia pe care ai inceput, ai putea sa scoti csv-urile din DWH cam asa:

main.csv
Id,Name,Country,Address,reportedCarsData
1,John,RO,address,1_CarsData.csv
2,David,AT,address,2_CarsData.csv
3,Helen,DE,address,3_CarsData.csv



1_CarsData.csv
reportedCarModel,year
Dacia,2021
Audi,2023



2_CarsData.csv
reportedCarModel,year
Mercedes,2020
Ford,2021



3_CarsData.csv
reportedCarModel,year
Porche,2024


Jobul tau ETL face parsing linie cu linie pe main.csv si pentru fiecare linie din main.csv parseaza tot linie cu line si fisierul cu numele mentionat in ultimul field a unei linii din main.csv ca sa scoata detaliile masinilor raportate si sa construieasca nodul/record-ul XML pentru ID-ul respectiv.

Asta presupune ca ETL-ul tau este un singur job care merge secvential/liniar pina cind termina de prelucrat toate liniile din main.csv si iti scoate un singur xml cu toate datele in el.


Inteleg cum zici dar ce ma fac daca sunt 200000 de reported Id? O sa ajung sa am un main.csv cu 200000 de inregistrari (primul nivel) si inca 200000 de CSV-uri separate.Nu cred ca-i un design bun.

Daca plec de la ideia initiala:
Id,Name,Country,Address,reportedCaModel,year
1,John,RO,address,Dacia, 2021
Audi, 2023
2,David,AT,address,Mercedes, 2021
Audi, 2022
Ford,2024

3,Helen,DE,address,Skoda, 2020


sa le am pe toate intr-un singur fisier CSV, imi fac viata complicata la citirea CSV-lui pentru ca o faci linie cu linie, si ajung sa am coloane empty care nu trebuie tratate ca erorri si care in algorithm trebuie luate ca parte a unui anumit reported Id.

LE: ETL-ul se va face pe un server on premise cu resurse asemanatoare unui laptop din zilele noastre: Xeon cateva core-uri si 16GB RAM.

Edited by fabian23, 01 March 2024 - 10:10.


#11
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Înscris: 18.09.2020
Volumul ala de date (200000 de Id-uri + N numar de masini pentru fiecare Id) o sa le ai oricum, indiferent daca le scrii intr-un singur fisier csv sau in mai multe, si oricum o sa trebuiasca sa le prelucrezi pe toate intr-un fel sau altul ca sa scoti unul sau mai multe XML-uri cu ele.

S-ar putea sa te surprinda, dar 400000 de fisiere nu sint o probelma chiar asa de mare cam pentru orice filesystem din zilele noastre.

Poate ti-ar fi mai usor daca te-ai gindi prima data din punct de vedere a procesului (ce ar trebui sa se intimple cu datele respective ? cit de repede ar trebui sa se intimple ? de cite ori pe zi ? cit de mare este batch-ul de date care trebuie prelucrat ?) si in functie de asta sa-ti planifici ETL-ul si felul in care iti organizezi datele in CSV-uri ca sa poata sa le inghita ETL-ul cit mai repede/eficient.

Edited by cralin, 01 March 2024 - 10:29.


#12
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Înscris: 06.03.2005

View Postcralin, on 01 martie 2024 - 10:26, said:

Poate ti-ar fi mai usor daca te-ai gindi prima data din punct de vedere a procesului (ce ar trebui sa se intimple cu datele respective ? cit de repede ar trebui sa se intimple ? de cite ori pe zi ? cit de mare este batch-ul de date care trebuie prelucrat ?) si in functie de asta sa-ti planifici ETL-ul si felul in care iti organizezi datele in CSV-uri ca sa poata sa le inghita ETL-ul cit mai repede/eficient.
  • Datele sunt trimise catre provider extern via SFTP;
  • Nu sunt date critice, procesul de ETL poate rula si peste noapte;
  • Nu sunt cerinte de performanta in ceea ce priveste timpul. Un timp rezonanil < 1-2h;
  • ETL-ul va rula o data la cateva luni;
  • Volumul de date este destul de mare: peste 20000 de raport Id-uri, toate totalizand peste 2500000 de reportedCarModels;

Edited by fabian23, 01 March 2024 - 18:55.


#13
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Înscris: 18.09.2020
Din datele alea trebuie sa faci obligatoriu un singur XML sau poti sa ai mai multe XML-uri cu 1 sau mai multe ID-uri in fiecare XML care apoi pot sa fie incarcate in urmatorul system indepndent unul de celalalt ?

Daca azi s-a terminat cu succes runda de conversie a datelor (200000 Id-uri), peste citeva luni cind rulezi din nou rulezi doar pe diferenta de date acumulata de la ultima rulare (1000 Id-uri) sau ai din nou tot setul de date care il primesti la input (201000 Id-uri) si care trebuie sa-l inghita iara ETL-ul ?

Daca ai delta, cam cite id-uri sint in setul delta respectiv ?

Edited by cralin, 01 March 2024 - 20:49.


#14
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Înscris: 18.09.2020
Daca privesti datele ca si cum ar fi in doua tabele dintr-o baza de date (cu Id fiind primary/foreign key in tabele) poti sa scapi cu doua fisiere csv.

Ceva de genul asta (doar datele raw in CSV, fara header in prima linie a CSV-ului):

main.csv
1,John,RO,The complete address 1
2,David,AT,The complete address 2
3,Helen,DE,The complete address 3
222,Gigel,RO,The complete address 222


reportedCarsData.csv
1,Dacia,2021
3,Porche,2024
2,Mercedes,2020
1,Audi,2023
2,Ford,2021
222,Lastun,1960


In ETL parsezi linie cu linie main.csv si extragi din reportedCarsData.csv doar liniile care incep cu Id-ul din linia care ai citi-o din main.csv.


etl.sh
#!/bin/bash
echo '<?xml version="1.0" encoding="UTF-8"?>'
echo '<dataBody xmlns="urn:ro:test:car:report:v1" xmlns:ns2="urn:ro:test:car:report:commontypes:v1" version="4.0">'
while IFS="," read -r _ID_ _NAME_ _COUNTRY_ _ADDRESS_
do
echo '<report Id="'$_ID_'">'
echo '<Name>'$_NAME_'</Name>'
echo '<Address>'
echo '<Country>'$_COUNTRY_'</Country>'
echo '<AddressFree>'$_ADDRESS_'</AddressFree>'
echo '</Address>'
REPORTED_CARS=$(cat $2 | grep ^$_ID_,)
while IFS="," read -r _CARDATA_ID_ _CARDATA_MODEL_ _CARDATA_YEAR_
	 do
	 echo '<reportedCar>'
	 echo '<model>'$_CARDATA_MODEL_'</model>'
	 echo '<year>'$_CARDATA_YEAR_'</year>'
	 echo '</reportedCar>'
done <<< "$REPORTED_CARS"
echo '</report>'
done < $1
echo '</dataBody>'





Il apelezi pe etl.sh cu cele doua CSV-uri ca parametii in linia de comanda si iti scoate XML-ul cu datele din CSV-uri:
./etl.sh main.csv reportedCarsData.csv | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<dataBody xmlns="urn:ro:test:car:report:v1" xmlns:ns2="urn:ro:test:car:report:commontypes:v1" version="4.0">
<report Id="1">
<Name>John</Name>
<Address>
	 <Country>RO</Country>
	 <AddressFree>The complete address 1</AddressFree>
</Address>
<reportedCar>
	 <model>Dacia</model>
	 <year>2021</year>
</reportedCar>
<reportedCar>
	 <model>Audi</model>
	 <year>2023</year>
</reportedCar>
</report>
<report Id="2">
<Name>David</Name>
<Address>
	 <Country>AT</Country>
	 <AddressFree>The complete address 2</AddressFree>
</Address>
<reportedCar>
	 <model>Mercedes</model>
	 <year>2020</year>
</reportedCar>
<reportedCar>
	 <model>Ford</model>
	 <year>2021</year>
</reportedCar>
</report>
<report Id="3">
<Name>Helen</Name>
<Address>
	 <Country>DE</Country>
	 <AddressFree>The complete address 3</AddressFree>
</Address>
<reportedCar>
	 <model>Porche</model>
	 <year>2024</year>
</reportedCar>
</report>
<report Id="222">
<Name>Gigel</Name>
<Address>
	 <Country>RO</Country>
	 <AddressFree>The complete address 222</AddressFree>
</Address>
<reportedCar>
	 <model>Lastun</model>
	 <year>1960</year>
</reportedCar>
</report>
</dataBody>


Edited by cralin, 01 March 2024 - 23:55.


#15
fabian23

fabian23

    Active Member

  • Grup: Members
  • Posts: 1,608
  • Înscris: 06.03.2005

View Postcralin, on 01 martie 2024 - 20:39, said:

Din datele alea trebuie sa faci obligatoriu un singur XML sau poti sa ai mai multe XML-uri cu 1 sau mai multe ID-uri in fiecare XML care apoi pot sa fie incarcate in urmatorul system indepndent unul de celalalt ?

Raportul final este un singur XML.

View Postcralin, on 01 martie 2024 - 20:39, said:

Daca azi s-a terminat cu succes runda de conversie a datelor (200000 Id-uri), peste citeva luni cind rulezi din nou rulezi doar pe diferenta de date acumulata de la ultima rulare (1000 Id-uri) sau ai din nou tot setul de date care il primesti la input (201000 Id-uri) si care trebuie sa-l inghita iara ETL-ul ?

Daca ai delta, cam cite id-uri sint in setul delta respectiv ?

Nu am Delta. La urmatoare iteratie este un nou set de date.

View Postcralin, on 01 martie 2024 - 23:46, said:

Daca privesti datele ca si cum ar fi in doua tabele dintr-o baza de date (cu Id fiind primary/foreign key in tabele) poti sa scapi cu doua fisiere csv.

Ceva de genul asta (doar datele raw in CSV, fara header in prima linie a CSV-ului):

main.csv
1,John,RO,The complete address 1
2,David,AT,The complete address 2
3,Helen,DE,The complete address 3
222,Gigel,RO,The complete address 222


reportedCarsData.csv
1,Dacia,2021
3,Porche,2024
2,Mercedes,2020
1,Audi,2023
2,Ford,2021
222,Lastun,1960


In ETL parsezi linie cu linie main.csv si extragi din reportedCarsData.csv doar liniile care incep cu Id-ul din linia care ai citi-o din main.csv.



Apreciez timpul investit in a prezenta un model si un bash script.

Corelatia pe care ai facut-o in fisiere insa nu este corecta. Unicitatea unui carModel nu este data de numele modelului in sine ci de un reportedCaseId (UUID vers.4). Pentru simplitate nu am pus complexType-ul intreg la reportedCar, acesta fiind ceva mai complex avand mai multe tag-uri. Cu alte cuvinte, fiecare reportedId are unul sau mai multe reporteCarModels indentificate prin reportedCaseId

<report Id="2">
<Name>David</Name>
<Address>
		 <Country>AT</Country>
		 <AddressFree>The complete address 2</AddressFree>
</Address>
<reportedCar>
		 <model>Mercedes</model>
		 <year>2020</year>
		<reportedCaseId type="Clearing">e65752276a19d7fabfab98f71514cb77</reportedCaseId>
		<!-- more elements -->
</reportedCar>
<reportedCar>
		 <model>Ford</model>
		 <year>2021</year>
		 <reportedCaseId type="Execution">e6ac636eb7c1a8fc1c460d5ad4add487</reportedCaseId>
		 <!-- more elements -->
</reportedCar>
</report>


Pentru implementare, probabil se va folosi Java (JAXB - pentru back and forward searching) cu streaming pentru a nu tine in memorie tot obiectul care creste exponential.

Edited by fabian23, 02 March 2024 - 10:50.


#16
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Înscris: 18.09.2020

View Postfabian23, on 02 martie 2024 - 10:48, said:

Corelatia pe care ai facut-o in fisiere insa nu este corecta. Unicitatea unui carModel nu este data de numele modelului in sine ci de un reportedCaseId (UUID vers.4). Pentru simplitate nu am pus complexType-ul intreg la reportedCar, acesta fiind ceva mai complex avand mai multe tag-uri. Cu alte cuvinte, fiecare reportedId are unul sau mai multe reporteCarModels indentificate prin reportedCaseId

Pentru transformarea din CSV in XML, in afara ca trebuie sa extinzi etl.sh cu cite valori/coloane are o linie citita din csv si sa construiesti corect output-ul XML in rest nu cred ca se schimba nimic daca ai mai multe detalii despre o masina.

Legatura intre datele din cele doua csv-uri o faci pe baza valorii din primul field al fiecarei linii din cele doua fisiere si nu pe baza UUID-ului din reportedCaseId

Uite:

main.csv
1,John,RO,The complete address 1
2,David,AT,The complete address 2
3,Helen,DE,The complete address 3
222,Gigel,RO,The complete address 222


reportedCarsData.csv
1,Dacia,2021,Cancelled,2c4c231b-f612-4725-876d-8a32c674d2eb
3,Porche,2024,Completed,c3e59825-81d2-47bd-b385-d0f587c2c434
2,Mercedes,2020,Clearing,e65752276a19d7fabfab98f71514cb77
1,Audi,2023,Completed,8a63217e-d019-46b9-ae23-1e52c4e57ffe
2,Ford,2021,Execution,e6ac636eb7c1a8fc1c460d5ad4add487
222,Lastun,1960,In approval,e1c76251-1721-4454-b35c-6657e42b8552



etl.sh
#!/bin/bash
echo '<?xml version="1.0" encoding="UTF-8"?>'
echo '<dataBody xmlns="urn:ro:test:car:report:v1" xmlns:ns2="urn:ro:test:car:report:commontypes:v1" version="4.0">'
while IFS="," read -r _ID_ _NAME_ _COUNTRY_ _ADDRESS_
do
echo '<report Id="'$_ID_'">'
echo '<Name>'$_NAME_'</Name>'
echo '<Address>'
echo '<Country>'$_COUNTRY_'</Country>'
echo '<AddressFree>'$_ADDRESS_'</AddressFree>'
echo '</Address>'
REPORTED_CARS=$(cat $2 | grep ^$_ID_,)
while IFS="," read -r _CARDATA_ID_ _CARDATA_MODEL_ _CARDATA_YEAR_ _CARDATA_REPORTED_CASEID_TYPE_ _CARDATA_REPORTED_CASEID_UUID_
	 do
	 echo '<reportedCar>'
	 echo '<model>'$_CARDATA_MODEL_'</model>'
	 echo '<year>'$_CARDATA_YEAR_'</year>'
	 echo '<reportedCaseId type="'$_CARDATA_REPORTED_CASEID_TYPE_'">'$_CARDATA_REPORTED_CASEID_UUID_'</reportedCaseId>'
	 echo '</reportedCar>'
done <<< "$REPORTED_CARS"
echo '</report>'
done < $1
echo '</dataBody>'



./etl.sh main.csv reportedCarsData.csv | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<dataBody xmlns="urn:ro:test:car:report:v1" xmlns:ns2="urn:ro:test:car:report:commontypes:v1" version="4.0">
<report Id="1">
<Name>John</Name>
<Address>
	 <Country>RO</Country>
	 <AddressFree>The complete address 1</AddressFree>
</Address>
<reportedCar>
	 <model>Dacia</model>
	 <year>2021</year>
	 <reportedCaseId type="Cancelled">2c4c231b-f612-4725-876d-8a32c674d2eb</reportedCaseId>
</reportedCar>
<reportedCar>
	 <model>Audi</model>
	 <year>2023</year>
	 <reportedCaseId type="Completed">8a63217e-d019-46b9-ae23-1e52c4e57ffe</reportedCaseId>
</reportedCar>
</report>
<report Id="2">
<Name>David</Name>
<Address>
	 <Country>AT</Country>
	 <AddressFree>The complete address 2</AddressFree>
</Address>
<reportedCar>
	 <model>Mercedes</model>
	 <year>2020</year>
	 <reportedCaseId type="Clearing">e65752276a19d7fabfab98f71514cb77</reportedCaseId>
</reportedCar>
<reportedCar>
	 <model>Ford</model>
	 <year>2021</year>
	 <reportedCaseId type="Execution">e6ac636eb7c1a8fc1c460d5ad4add487</reportedCaseId>
</reportedCar>
</report>
<report Id="3">
<Name>Helen</Name>
<Address>
	 <Country>DE</Country>
	 <AddressFree>The complete address 3</AddressFree>
</Address>
<reportedCar>
	 <model>Porche</model>
	 <year>2024</year>
	 <reportedCaseId type="Completed">c3e59825-81d2-47bd-b385-d0f587c2c434</reportedCaseId>
</reportedCar>
</report>
<report Id="222">
<Name>Gigel</Name>
<Address>
	 <Country>RO</Country>
	 <AddressFree>The complete address 222</AddressFree>
</Address>
<reportedCar>
	 <model>Lastun</model>
	 <year>1960</year>
	 <reportedCaseId type="In approval">e1c76251-1721-4454-b35c-6657e42b8552</reportedCaseId>
</reportedCar>
</report>
</dataBody>


Edited by cralin, 02 March 2024 - 14:29.


#17
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
Simplu, usor de inteles. 1 singur fisier.

Banal de transformat in XML, n-ar trebui sa dureze mai mult de cateva secunde pt milioane de inregistrari.

Attached File  Untitled.png   13.19K   6 downloads

#18
cralin

cralin

    Member

  • Grup: Members
  • Posts: 667
  • Înscris: 18.09.2020
@dani.user,
Nu stii apriori cit de multe date ai si cel mai probabil ca o sa-ti crape excelul cind il pui sa-ti incarce un csv de citeva sute de MB si citeva milioane de linii in el.


View Postfabian23, on 01 martie 2024 - 18:43, said:

  • Volumul de date este destul de mare: peste 20000 de raport Id-uri, toate totalizand peste 2500000 de reportedCarModels;

Cu 2500000 de linii de masini raportate deja depasesti destul de bine limitele excelului din punct de vedere al numarului maxim de linii care poti sa le ai intr-un worksheet.

Posted Image

Edited by cralin, 02 March 2024 - 18:39.


Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate