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

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…

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.