![](https://ioox.studio/wp-content/uploads/2022/04/main.jpg)
Kada radimo sa internet trgovinom, radimo i sa podacima proizvoda koji su pohranjeni u XML, JSON, CSV ili SQL datotekama. Problem je u tome što ponekad moramo podatke dostaviti našem trgovcu/šefu koji koristi spreadsheet software, znači (Google Sheets ili Excel). Kako ćemo to napraviti?
Recimo da imamo XML datoteku i recimo da istu želimo učitati u Excel. Prvo što moramo je prebaciti XML u CSV format. Koristimo Linux, zašto? Zato što imamo mnoštvo CLI alata za manipulaciju datotekama i što možemo “mješati” bash sa python skriptama. Ako dodamo i node.js, onda na jednostavan način možemo dodati i webapi-je u bash mix.
XML datoteka
Ovdje ćemo koristiti example.xml datoteku:
<?xml version="1.0" encoding="UTF-8"?> <breakfast_menu> <food> <name>Belgian Waffles</name> <price>$5.95</price> <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description> <calories>650</calories> </food> <food> <name>Strawberry Belgian Waffles</name> <price>$7.95</price> <description>Light Belgian waffles covered with strawberries and whipped cream</description> <calories>900</calories> </food> <food> <name>Berry-Berry Belgian Waffles</name> <price>$8.95</price> <description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream</description> <calories>900</calories> </food> <food> <name>French Toast</name> <price>$4.50</price> <description>Thick slices made from our homemade sourdough bread</description> <calories>600</calories> </food> <food> <name>Homestyle Breakfast</name> <price>$6.95</price> <description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</description> <calories>950</calories> </food> </breakfast_menu>
Zarez i navodnici
Problem sa konverzijom XML-a u CSV su znakovi koji se koriste za razdvajanje elemenata u CSV-u. CSV lista odvaja stupce sa zarezom. Pa ćemo prvo XML provući kroz bash skriptu ‘replaceComma.sh’ koja će zamjeniti zarez sa zamjenskim utf-8 zarezom.
#!/bin/bash sed 's/,/,/g' $1 > fixed.xml
Isto tako, string u CSV listi je između navodnika. Pa ako je potrebno, možemo napraviti još jednu skriptu ‘replaceDoubleQuotes.sh’:
#!/bin/bash sed 's/"/“/g' $1 > fixed.xml
Skripte koristimo ovako:
replaceComma.sh ./example.xml
Nodejs
Idemo složiti projekt u terminalu:
mkdir xmlcsv cd ./xmlcsv touch index.js touch parse.js echo "console.log('hello world')" > index.js
Pravimo novi projekt (enter na sve).
npm init
Pa dobijemo ‘package.json’. Zatim ubacivamo “node index.js” i “node parse.js” pod scripts:
{ "name": "xmlcsv", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "node index.js", "parse": "node parse.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
Pa testiramo sa:
npm start
![](https://ioox.studio/wp-content/uploads/2022/04/01.png)
Zatim instaliramo:
npm install xml-csv --save npm install papaparse --save
XML-CSV
Sa xml-csv paketićem konvertiramo XML u CSV. Kao ‘rootXMLElement’ element postavljamo parent XML grupu, grupu iz koje želimo uzeti podatke. A pod ‘headerMap’ stupce koje želimo “ugrabiti”.
Znači ovo ide u ‘index.js’:
const fs = require("fs"); const xmlcsv = require("xml-csv"); xmlcsv({ source: fs.createReadStream("./fixed.xml"), rootXMLElement: "food", headerMap: [ ["name", "name", "string"], ["price", "price", "string"], ["description", "description", "string"], ["calories", "calories", "string"], ] }).pipe(fs.createWriteStream("./fixed.csv"));
Idemo opet ‘npm start’ pa dobijemo ‘fixed.csv’ koji izgleda ovako:
name,price,description,calories Belgian Waffles,$5.95,Two of our famous Belgian Waffles with plenty of real maple syrup,650 Strawberry Belgian Waffles,$7.95,Light Belgian waffles covered with strawberries and whipped cream,900 Berry-Berry Belgian Waffles,$8.95,Light Belgian waffles covered with an assortment of fresh berries and whipped cream,900 French Toast,$4.50,Thick slices made from our homemade sourdough bread,600 Homestyle Breakfast,$6.95,Two eggs, bacon or sausage, toast, and our ever-popular hash browns,950
I sada podatke možemo uvesti u Excel…
![](https://ioox.studio/wp-content/uploads/2022/04/csv-import-libreoffice-1024x553.png)
Kao alternativu, možemo koristiti ovaj web site: https://www.convertcsv.com/xml-to-csv.htm
CSV obrada
Ako želimo dalje manipulirati sa listom onda koristimo “Papa Parse” JS lib.
U ‘parse.js’ ubacivamo:
const fs = require("fs"); const papaParse = require("papaparse"); const main = async () => { let csvData = await fs.readFileSync('./fixed.csv','utf8'); let parsedData = papaParse.parse(csvData); //console.log(parsedData); for (let i=1; i<parsedData.data.length; i++) { let name = parsedData.data[i][0]; console.log(name); } }; main();
Sada imamo sve podatke u FOR petlji i možemo s njima manipulirati. Osobno koristim ovu metodu da stvorim novu listu proizvoda koju mogu uvesti u WooCommerce trgovinu.