Format inventarisbestanden (Amazon)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Inventaris kun je uploaden als Excel- of tekstbestand. Dit artikel behandelt voornamelijk deze laatste mogelijkheid.

Samenvatting (mei 2016-okt. 2020)

  • Extentie: .csv, .tsv of .txt (Excel: .xls & .xslx)
  • Tabgescheiden -- Komma-gescheiden werkt niet
  • Tekencodering: Latin1 - ISO 8859-1
  • Velden kunnen zowel met als zonder dubbele aanhalingstekens omsloten worden. Alle velden zijn alfanumeriek. Er zijn geen numerieke of binaire velden
  • Er worden geen eisen gesteld aan bestandsnamen. Spaties of compleet afwijkende bestandsnamen zijn geen probleem
  • Je kunt probleemloos zelf een bestand aanmaken
  • Als velden ontbreken, is dat geen probleem voor check your file, zolang de aanwezige velden maar wel kloppen
  • Velden mogen niet het maximale aantal karakters overschrijden. Als dat toch gebeurt, wordt het betreffende record niet geaccepteerd
  • Onbekende kolommen zijn geen probleem
  • Volgorde van kolommen maakt niet uit. De informatie in de eerste regel van de header, moet wél in de juiste volgorde staan.
Bestand:20160514-1428.png
Onbekende kolommen genereren een waarschuwing, maar zijn verder geen enkel probleem. Gelukkig: Verwijderen van niet-relevante kolommen uit een exportbestand, is namelijk verrassend veel werk
Dit dus

Header

  • Van de eerste rij, hoeven alleen de eerste paar velden gebruikt te worden
  • De tweede en derde rij bevatten standaard de kolomtitels in het Engels en in de locale taal. Je kun hier echter ook twee keer de kolomtitels in het Engels invoegen - Dat scheelt heel veel tijd!

Bestandscodering (mei 2016 - juli 2018)

UTF-8 werkt duidelijk niet
Amazon-uploadbestand gecodeerd in Latin1. File-codering achterhaald in Vim mbv. set fileencoding

Amazon kan in beginsel alleen overweg met ISO-8859-1, aka. Windows Latin 1 of Latin1. Dat is een 1 byte/karakter-codering. Als je geen bijzondere tekens gebruikt, werkt UTF-7 of -8 ook prima, maar je zult versteld staan hoe snel je al een teken gebruikt dat anders is gecodeerd in utf8 tov. latin1. Bv. ø (doorsnede), € of ü.

Indien een exportbestand al is opgemaakt in UTF8, kun je dit converteren met bv. de command-line tool iconv:

iconv -f utf-8 -t iso-8859-1 ./amazon-export.tsv > ./amazon-export-iso.tsv

of door 't bestand te openen in Vim en te converteren middels :set fileencoding latin1

Veldlengte

Amazon specificeert maximale veldlengte in bytes en niet in karakters. Daarnaast zijn dit minder-dan-waardes. Dus als ergens '250 bytes' staat, wordt bedoeld minder dan 250 bytes. Als je teveel tekens gebruikt, krijg je een foutmelding en wordt het betreffende record doorgaans niet geaccepteerd.

De truuk is, dat Amazon veldlengtes berekent in utf8-codering en niet in latin1-codering. Waarom dat belangrijk is: Latin1 is een 1 byte/karakter-codering, waar utf8 al snel meerdere bytes gebruikt voor dezelfde tekens (bv. '€'). Enkele tests (juli 2018) om deze verschillen te illustreren (OK of Niet OK wil zeggen of Amazon deze waardes accepteert na upload):

OK,        char_length: 248,   byte length latin1: 248,   byte length utf8: 248
OK,        char_length: 249,   byte length latin1: 249,   byte length utf8: 249
OK,        char_length: 249,   byte length latin1: 249,   byte length utf8: 249
OK,        char_length: 249,   byte length latin1: 249,   byte length utf8: 249

Niet OK,   char_length: 250,   byte length latin1: 250,   byte length utf8: 250
Niet OK,   char_length: 249,   byte length latin1: 249,   byte length utf8: 252
Niet OK,   char_length: 248,   byte length latin1: 248,   byte length utf8: 252
Niet OK,   char_length: 249,   byte length latin1: 249,   byte length utf8: 252
Niet OK,   char_length: 249,   byte length latin1: 249,   byte length utf8: 257

Voorbeeld-MySQL-code voor deze tests:

set @01="...";
set @02="...";
set @03="...";
# 
select 
	"Niet OK"	as status,
	concat("char_length: ", char_length(		@01)) 		    as char_byte,
	concat("byte length latin1: ", length(convert(	@01 using latin1))) as byte_length_latin1,
        concat("byte length utf8: ", length(convert(	@01 using utf8)))   as byte_length_utf8
union select
	"OK"		as status,
	concat("char_length: ", char_length(		@02)) 		    as char_byte,
	concat("byte length latin1: ", length(convert(	@02 using latin1))) as byte_length_latin1,
        concat("byte length utf8: ", length(convert(	@02 using utf8)))   as byte_length_utf8    
union select
 	"Niet OK"	as status,
 	concat("char_length: ", char_length(		@03)) 		    as char_byte,
 	concat("byte length latin1: ", length(convert(	@03 using latin1))) as byte_length_latin1,
        concat("byte length utf8: ", length(convert(	@03 using utf8)))   as byte_length_utf8;

Voorbeelden - PMA

Dit zijn voorbeelden van geslaagde testen. Overigens, ik gebruik PMA (PHPMyAdmin) niet voor operationeel werk. Daarvoor gebruik ik geprogrammeerde exports vanuit MySQL.

Velden omsloten met dubbele aanhalingstekens

"TemplateType=HomeImprovement"	"Version=2014.1223"	NULL	NULL	NULL	NULL
"Lagerhaltungsnummer"	"Hersteller-Barcode"	"Barcode-Typ"	"Titel"	"Marke"	"Hersteller"
"item_sku"	"external_product_id"	"external_product_id_type"	"item_name"	"brand_name"	"manufacturer"
"01234"	"8435146742123"	"EAN"	"Widgets for Bosch Gerät"	"Smalec"	"Smalec"
"01345"	"8435146742123"	"EAN"	"Widgets for Bosch Gerät"	"Smalec"	"Smalec"

Zonder aanhalingstekens en overgeslagen veld 'Price'

TemplateType=HomeImprovement	Version=2014.1223	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL
Lagerhaltungsnummer	Hersteller-Barcode	Barcode-Typ	Titel	Marke	Hersteller	Artikelnummer/Seriennummer	Produkttyp	Produktbeschreibung	Update / Löschen	Preis
item_sku	external_product_id	external_product_id_type	item_name	brand_name	manufacturer	part_number	feed_product_type	product_description	update_delete	standard_price
01fd1	8435146742338	EAN	Widgets	Smalec	Smalec	01fs	Electrical	Carbon brushes 01222 for power tools<ul><li> Product code: 0fs1<li> Dimensions (mm, from smallest to largest): 6.4 x 6.4 x 16<li> Number of pieces per package: 2<li> Alternative product codes: 0101J, FAE11fsfsJ	Update	5.0000
fsfs	8435146742341	EAN	Widgets	Smalec	Smalec	0fs1	Electrical	Carbon brushes 01234 for power tools<ul><li> Product code: 01fs<li> Dimensions (mm, from smallest to largest): 6.4 x 8 x 16.5<li> Number of pieces per package: 2<li> Alternative product codes: 0102J, FAE110dfg2J	Update	7.2500

Zie ook

Bronnen